一個簡單小爬蟲實現(xiàn)對全本小說的下載

? 這幾天看見有許多分享用python爬蟲獲取小說的文章,弄得我自己也手癢了,于是就寫了個小爬蟲,基本能實現(xiàn)分析下載小說以.TXT格式下載到本地的功能。只是關(guān)于文本格式以及網(wǎng)頁防吊死的問題暫時沒有處理,本文主要是給想爬小說的小伙伴們一個思路,當(dāng)然,源代碼也在文章最后,隨時都可以跑起來。

一.python環(huán)境及編輯器(用到的庫和模塊)

運(yùn)行平臺: win7

Python版本: Python3.x?

IDE: pycharm?

模塊:Beautiful Soup,urllib

由于本文主要是實戰(zhàn)展示,所以就沒有對于庫和模塊的安裝,講解。具體使用方法可以看官方文檔,安裝過程有需要可以留下評論。我這里就只附上我看過后感覺寫的不錯的文檔鏈接,大家可以自行查詢:

Beautiful Soup:‘https://cuiqingcai.com/1319.html’

urllib:‘http://www.itdecent.cn/p/63dad93d7000’

二.確定目標(biāo)

因為某閣是個盜版小說網(wǎng)站,而且我發(fā)現(xiàn)這個網(wǎng)站沒有反爬蟲的機(jī)制,所以對新手爬友比較友好,所以我就以這個網(wǎng)站作為實戰(zhàn)示范。

筆趣閣主頁url:‘https://www.biquge.cm/’

不知道大家平時喜歡看誰的小說,我從中學(xué)就喜歡看西紅柿大大的小說,所以這次就以爬取大大的‘飛劍問道’這本小說作為目標(biāo)。


通過地址欄我們可以獲得這個目錄頁面的url:https://www.biquge.cm/10/10963/,下面我們就可以開始分析該網(wǎng)站的HTML結(jié)構(gòu),想辦法取出我們想要獲得內(nèi)容。

三.過程分析

解析工具有很多,爬取方式也有很多,我這里就簡單說下我自己的思路。

1.通過目錄頁面獲得小說所有章節(jié)的鏈接地址。

2.通過第一步獲得的鏈接地址,爬取每一章節(jié)的正文內(nèi)容。

3.把爬取到的正文保存在TXT文檔,并下載到本地。

我的大致思路就是這個樣子,你們也可以選擇其他方式獲取每一章節(jié)的url地址,比如使用selenium,或者用開發(fā)者工具找到下一頁的標(biāo)簽再提取。不管黑貓白貓,能抓到耗子就是好貓,所以編程是一件有趣的事情,通過不同的方法可以達(dá)到同樣的目的。好了,閑話不多說,大致思路有了之后,我們就開始代碼實現(xiàn)。

四.代碼實現(xiàn)

第一步,先引用我們需要用到的模塊和庫,美味湯和urllib。


第二步,我們定義一個函數(shù)模塊,用來獲得頁面原始數(shù)據(jù)。



第三步,我們定義一個專門分析頁面的函數(shù),用來反復(fù)調(diào)取。這個解析器就是我們的美味湯(Beautiful Soup),完成這一步后,前期的基礎(chǔ)工作就算搞定了,這樣我們就能分析每個頁面的數(shù)據(jù)了。


第四步,我們正式開始分析小說,還記得我們最開始的思路嗎,第一步,先獲取每一章小說的鏈接。打開開發(fā)者工具(F12或者右鍵檢查),用選擇工具隨便點幾個章節(jié)目錄,發(fā)現(xiàn)他們都在? <div id="list">這個父級標(biāo)簽下.


我們使用Ctrl+F查找這個標(biāo)簽,發(fā)現(xiàn)在目錄頁,這個標(biāo)簽是唯一的,所以我們獲得如下信息。1.所以章節(jié)鏈接都在<div id="list">標(biāo)簽下 2.標(biāo)簽屬性id=‘list’是唯一的,通過這個屬性,我們就能得到所有章節(jié)鏈接。



那我們只需要紅圈內(nèi)的地址,如何提取呢?這里可以使用正則表達(dá)式,或者seleck方法,但我這里直接選擇了find的方法,簡單粗暴好理解。經(jīng)過觀察分析我們得知,這里的地址是每個章節(jié)url的后半部分,所以我們需要對其進(jìn)行拼接才能得到真實的url,所以代碼如下


第5步,定義獲取每一章小說正文的函數(shù),用同樣的方法分析獲得每一章小說的正文,我們發(fā)現(xiàn)正文在<div id="content">標(biāo)簽下,且屬性也是唯一的。


這里可以對文本格式進(jìn)行處理,但是我為了快速實現(xiàn)功能就沒有搞這些。大家后續(xù)可以在我這個基礎(chǔ)上優(yōu)化代碼,我這里就不做過多解釋了,所以代碼如下。


第6步,定義一個函數(shù)下載并保存我們的小說,這里比較簡單,直接上代碼


第7步,運(yùn)行部分代碼


第8步,點擊運(yùn)行就OK了,附一張運(yùn)行的圖



按照以上操作步驟,代碼基本就實現(xiàn)了,注意我這里沒有定義保存路徑,所以默認(rèn)保存在當(dāng)前文件夾,需要注意。最好把源碼分享給大家。拿去跑一跑吧。


import urllib,bs4

from bs4 import BeautifulSoup

#引入模塊和庫

#獲取頁面初始數(shù)據(jù)

def getHtmlcode(url):

? ? #請求頭,雖然這個網(wǎng)站不需要,但是這算是反反爬蟲的一種最基本手段

? ? user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

? ? headers = {"User-Agent": user_agent}

? ? response=urllib.request.Request(url,headers=headers)#發(fā)起請求

? ? result=urllib.request.urlopen(response)#打開頁面

? ? html=result.read()#讀取頁面

? ? return html? #返回頁面信息

#分析頁面

def paarser(url):

? ? html=getHtmlcode(url)#調(diào)用getHtmlcode函數(shù)

? ? soup=BeautifulSoup(html,'html.parser')#用美味湯分析,得到bs文件

? ? return soup

#獲取每章節(jié)目錄鏈接

def Charpter_url(url):

? ? soup=paarser(url)#調(diào)用parser分析頁面

? ? datas=soup.find('div',id="list").find_all('a')#獲得需要的數(shù)據(jù)

? ? url_list=[]#新建列表用來儲存url地址

? ? for data in datas:

? ? ? ? page_url='https://www.biquge.cm'+data['href']#拼接成真實地址

? ? ? ? page_name=data.text#每一章的小說名字

? ? ? ? url_list.append(page_url)

? ? return url_list

#獲取文章單章正文

def get_Charpter_text(url):

? ? soup=paarser(url)#調(diào)用parser分析頁面

? ? content=soup.find('div',id="content").text#獲得需要的正文

? ? content1=content.strip().replace("<br />", "")#順手處理下格式問題

? ? return content

#保存文件

def save_text(url):

? ? url_list=Charpter_url(url)

? ? num=1

? ? with open('飛劍問道.text','a',encoding='utf-8') as f:

? ? ? ? for page_url in url_list:

? ? ? ? ? ? contents=get_Charpter_text(page_url)

? ? ? ? ? ? f.write(contents)

? ? ? ? ? ? print('第{}章下載完成'.format(num))

? ? ? ? ? ? num+=1

? ? ? ? f.close()

if __name__=='__main__':

? ? url='https://www.biquge.cm/10/10963/'

? ? save_text(url)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容