南京網(wǎng)站設(shè)計費用推廣網(wǎng)絡(luò)公司
前言
在信息爆炸的時代,網(wǎng)絡(luò)上充斥著大量的小說資源,讓人們能夠隨時隨地盡享閱讀的樂趣。然而,有些小說網(wǎng)站要求用戶付費才能獲取完整的內(nèi)容,這給許多人帶來了困擾,尤其是像我這類對金錢概念模糊的人。不過,我們也許可以嘗試使用爬蟲技術(shù)來獲取我們想要的小說內(nèi)容。
然而,實際操作中,我們可能會遇到各種各樣的困難,使得爬取小說的任務(wù)變得異常艱難,讓人望而卻步。下面是我在準備過程中考慮到的一些問題。
首先,我們需要面對的第一個問題就是網(wǎng)站的動態(tài)加載。許多小說網(wǎng)站為了提高用戶體驗,會使用JavaScript來動態(tài)加載和展示內(nèi)容。這使得我們傳統(tǒng)的爬蟲方法無法有效地抓取我們需要的數(shù)據(jù)。為了解決這個問題,
其次,我們需要面臨的問題是網(wǎng)站的防爬機制。一些小說網(wǎng)站為了防止機器人訪問,會設(shè)置防爬機制,比如檢測請求的頻率、檢查User-Agent等。我通過調(diào)整爬蟲的請求頻率、偽裝User-Agent以及隨機化請求頭等方式來規(guī)避這些防爬機制。
最后,我們需要處理的問題是內(nèi)容的版權(quán)問題。在進行爬取的過程中,我們必須尊重網(wǎng)站的版權(quán)規(guī)定,避免侵犯他人的知識產(chǎn)權(quán)。
第一步.選擇合適的爬取工具
我最初的嘗試是使用Python中的BeautifulSoup模塊。這是一個非常強大的HTML解析庫,能夠方便地從網(wǎng)頁中提取出需要的信息。然而,在爬取小說網(wǎng)站時,我很快發(fā)現(xiàn)了問題。這些小說網(wǎng)站通常會使用JavaScript動態(tài)加載內(nèi)容,而BeautifulSoup并不能很好地處理這種情況。因此,我需要尋找一種能夠處理JavaScript動態(tài)加載內(nèi)容的爬蟲工具。
第二步.嘗試使用Selenium庫
為了應(yīng)對動態(tài)加載的問題,我轉(zhuǎn)而使用了Selenium庫。Selenium可以模擬瀏覽器的行為,包括執(zhí)行JavaScript代碼,從而能夠獲取到完整的頁面內(nèi)容。我發(fā)現(xiàn),通過Selenium,我可以獲取到想要的小說內(nèi)容,但是又遇到了新的問題。
第三步:Webdriver變量路徑安裝問題
在使用Selenium時,我需要指定一個Webdriver,它相當于一個瀏覽器的實例,用于加載網(wǎng)頁并執(zhí)行操作。然而,我在安裝過程中遇到了Webdriver變量路徑的問題。我嘗試了多種方法,但始終無法成功地將Webdriver正確地配置到我的環(huán)境中。
在我嘗試解決Webdriver變量路徑問題時,我遇到了一些挫折。我嘗試按照Selenium官方文檔的指導,將Webdriver的路徑設(shè)置到瀏覽器的安裝目錄下,但仍然無法成功。
后來,我意識到問題可能出在環(huán)境變量上。我需要在系統(tǒng)環(huán)境變量中添加Webdriver的路徑,才能讓Selenium正確地找到并使用它。于是,我按照這個思路進行了操作,并成功地將Webdriver正確地配置到了我的環(huán)境中。
具體來說,我按照以下步驟操作:
法①
-
找到Webdriver的路徑。
在Windows系統(tǒng)中,Webdriver通常位于瀏覽器的安裝目錄下,例如:C:\Program Files (x86)\Mozilla Firefox\geckodriver.exe -
在系統(tǒng)環(huán)境變量中添加Webdriver的路徑。
在Windows系統(tǒng)中,可以在系統(tǒng)屬性->高級->環(huán)境變量中添加新的系統(tǒng)環(huán)境變量,將Webdriver的路徑添加到其中 -
重新啟動Selenium并測試是否成功。
?法②
1. 下載合適版本的Webdriver,并將其解壓到一個目錄中。(我是解壓到python安裝目錄下,記住復制一份并改名,添加變量才能成功)
2. 將Webdriver的路徑添加到系統(tǒng)的環(huán)境變量中。這樣,無論在哪個目錄下,系統(tǒng)都能夠找到Webdriver的位置。
通過以上步驟,我終于成功地將Webdriver正確地配置到了我的環(huán)境中,可以正常地使用Selenium進行網(wǎng)頁內(nèi)容的爬取了。
最終代碼
注意事項:
1.一次只能下一本,如果要下一本你需要把txt文本提到一個文件夾中,清空。
2.一定要安裝相應(yīng)的庫
import os
import re
from selenium import webdriver
from bs4 import BeautifulSoup
import time
from tqdm import tqdm# 作者信息
from termcolor import coloredauthor_name = "作者:O2Ethereal"
author_url = "https://gitee.com/o2ethereal"print(f"{author_name}\n{author_url}")
print("網(wǎng)站舉例:\nhttps://www.biqukan8.cc/38_38836/")# 用戶輸入小說目錄下載地址
directory_url = input("請輸入小說目錄下載地址(回車鍵繼續(xù)):")# 創(chuàng)建 Edge WebDriver,使用無痕模式
options = webdriver.EdgeOptions()
options.add_argument('--inprivate')
driver = webdriver.Edge(options=options)# 打開小說目錄頁面
driver.get(directory_url)
time.sleep(5) # 等待頁面加載# 獲取頁面源碼
directory_html = driver.page_source
soup = BeautifulSoup(directory_html, 'html.parser')# 獲取章節(jié)鏈接和標題
chapter_data = []
in_content_div = False
for element in soup.find_all(['dt', 'dd']):if "正文卷" in element.get_text():in_content_div = Trueelif in_content_div and element.name == 'dd':link = element.a.get('href')if link.startswith("/"):link = link[1:] # 去除開頭的斜杠chapter_url = f"https://www.biqukan8.cc/{link}"title = element.a.get_text()chapter_data.append((title, chapter_url))# 創(chuàng)建文件夾
output_folder = "novel_chapters"
os.makedirs(output_folder, exist_ok=True)# 正則表達式模式
pattern = re.compile(r'(我們會盡快處理\.舉報后請耐心等待,并刷新頁面。|\(\)章節(jié)錯誤,點此舉報\(免注冊\)我們會盡快處理\.舉報后請耐心等待,并刷新頁面。|筆趣閣手機版閱讀網(wǎng)址:m\.biqukan8\.cc|請記住本書首發(fā)域名:www.biqukan8.cc。)')# 保存每個章節(jié)的內(nèi)容到文件
for idx, (title, link) in enumerate(tqdm(chapter_data, desc="Downloading", ncols=100, bar_format="{l_bar}%s{bar:10}{r_bar} {percentage:3.0f}%",colour="cyan"), start=1):# 打開章節(jié)頁面driver.get(link)time.sleep(0.5) # 等待頁面加載chapter_soup = BeautifulSoup(driver.page_source, 'html.parser')# 獲取章節(jié)內(nèi)容content_div = chapter_soup.find('div', class_='showtxt')if content_div:chapter_content = content_div.get_text()# 去除章節(jié)鏈接chapter_content = chapter_content.replace(link, "")# 使用正則表達式清理文本chapter_content = re.sub(pattern, '', chapter_content)# 去除空行l(wèi)ines = [line.strip() for line in chapter_content.split('\n') if line.strip()]cleaned_content = '\n'.join(lines)# 保存到文件file_name = os.path.join(output_folder, f"{title}.txt")with open(file_name, "w", encoding="utf-8") as file:file.write(cleaned_content)print(f"Downloading: {idx / len(chapter_data) * 100:.0f}%|▏ {title} 已下載")# 關(guān)閉 WebDriver
driver.quit()
效果
?好東西,偷偷用