閱讀624 返回首頁    go Python


Python 爬蟲:爬取小說花千骨

知識就像碎布,記得“縫一縫”,你才能華麗麗地亮相。

1.Beautiful Soup

1.Beautifulsoup 簡介

此次實戰從網上爬取小說,需要使用到Beautiful Soup。

Beautiful Soup為python的第三方庫,可以幫助我們從網頁抓取數據。

它主要有如下特點:

1.Beautiful Soup可以從一個HTML或者XML提取數據,它包含了簡單的處理、遍曆、搜索文檔樹、修改網頁元素等功能。可以通過很簡短地代碼完成我們地爬蟲程序。

2.Beautiful Soup幾乎不用考慮編碼問題。一般情況下,它可以將輸入文檔轉換為unicode編碼,並且以utf-8編碼方式輸出,

2.Beautiful Soup安裝

win命令行下:

pip install beautifusoup4

3.Beautiful Soup基礎

大家可以參考文檔來學習(中文版的哦):https://beautifulsoup.readthedocs.io/zh_CN/latest/#id8

對於本次爬蟲任務,隻要了解以下幾點基礎內容就可以完成:

1.Beautiful Soup的對象種類:

Tag

Navigablestring

BeautifulSoup

Comment

2.遍曆文檔樹:find、find_all、find_next和children

3.一點點HTML和CSS知識(沒有也將就,現學就可以)

2.爬取小說花千骨

1.爬蟲思路分析

本次爬取小說的網站為136書屋。

先打開花千骨小說的目錄頁,是這樣的。

我們的目的是找到每個目錄對應的url,並且爬取其中地正文內容,然後放在本地文件中。

2.網頁結構分析

首先,目錄頁左上角有幾個可以提高你此次爬蟲成功後成就感的字眼:暫不提供花千骨txt全集下載。

繼續往下看,發現是最新章節板塊,然後便是全書的所有目錄。我們分析的對象便是全書所有目錄。點開其中一個目錄,我們便可以都看到正文內容。

按F12打開審查元素菜單。可以看到網頁前端的內容都包含在這裏。

我們的目的是要找到所有目錄的對應鏈接地址,爬取每個地址中的文本內容。

有耐心的朋友可以在裏麵找到對應的章節目錄內容。有一個簡便方法是點擊審查元素中左上角箭頭標誌的按鈕,然後選中相應元素,對應的位置就會加深顯示。

這樣我們可以看到,每一章的鏈接地址都是有規則地存放在中。而這些又放在

中。

我不停地強調“我們的目的”是要告訴大家,思路很重要。爬蟲不是約pao,蒙頭就上不可取。

3.單章節爬蟲

剛才已經分析過網頁結構。我們可以直接在瀏覽器中打開對應章節的鏈接地址,然後將文本內容提取出來。

我們要爬取的內容全都包含在這個

裏麵。

代碼整理如下:

fromurllibimportrequest

frombs4importBeautifulSoup

if__name__== __main__ :

# 第8章的網址

url= https://www.136book.com/huaqiangu/ebxeew/

head={}

# 使用代理

head[ User-Agent ]= Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19

req=request.Request(url,headers=head)

response=request.urlopen(req)

html=response.read()

# 創建request對象

soup=BeautifulSoup(html, lxml )

# 找出div中的內容

soup_text=soup.find( div ,id= content )

# 輸出其中的文本

print(soup_text.text)

運行結果如下:

這樣,單章節內容爬取就大功告成了。

4.小說全集爬蟲

單章節爬蟲我們可以直接打開對應的章節地址解析其中的文本,全集爬蟲我們不可能讓爬蟲程序在每章節網頁內中跑一遍,如此還不如複製、粘貼來的快。

我們的思路是先在目錄頁中爬取所有章節的鏈接地址,然後再爬取每個鏈接對應的網頁中的文本內容。說來,就是比單章節爬蟲多一次解析過程,需要用到Beautiful Soup遍曆文檔樹的內容。

1.解析目錄頁

在思路分析中,我們已經了解了目錄頁的結構。所有的內容都放在一個所有的內容都放在一個

中。

這兒有兩個一模一樣的

第一個

包含著最近更新的章節,第二個

包含著全集內容。

請注意,我們要爬取的是第二個

中的內容。

代碼整理如下:

fromurllibimportrequest

frombs4importBeautifulSoup

if__name__== __main__ :

# 目錄頁

url= https://www.136book.com/huaqiangu/

head={}

head[ User-Agent ]= Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19

req=request.Request(url,headers=head)

response=request.urlopen(req)

html=response.read()

# 解析目錄頁

soup=BeautifulSoup(html, lxml )

# find_next找到第二個

soup_texts=soup.find( div ,id= book_detail ,class_= box1 ).find_next( div )

# 遍曆ol的子節點,打印出章節標題和對應的鏈接地址

iflink!= \n :

print(link.text+ : ,link.a.get( href ))

執行結果如圖:

2.爬取全集內容

將每個解析出來的鏈接循環代入到url中解析出來,並將其中的文本爬取出來,並且寫到本地F:/huaqiangu.txt中。

代碼整理如下:

fromurllibimportrequest

frombs4importBeautifulSoup

if__name__== __main__ :

url= https://www.136book.com/huaqiangu/

head={}

head[ User-Agent ]= Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19

req=request.Request(url,headers=head)

response=request.urlopen(req)

html=response.read()

soup=BeautifulSoup(html, lxml )

soup_texts=soup.find( div ,id= book_detail ,class_= box1 ).find_next( div )

# 打開文件

f=open( F:/huaqiangu.txt , w )

# 循環解析鏈接地址

iflink!= \n :

download_url=link.a.get( href )

download_req=request.Request(download_url,headers=head)

download_response=request.urlopen(download_req)

download_html=download_response.read()

download_soup=BeautifulSoup(download_html, lxml )

download_soup_texts=download_soup.find( div ,id= content )

# 抓取其中文本

download_soup_texts=download_soup_texts.text

# 寫入章節標題

f.write(link.text+ \n\n )

# 寫入章節內容

f.write(download_soup_texts)

f.write( \n\n )

f.close()

執行結果顯示 [Finished in 32.3s] 。

打開F盤查看花千骨文件。

爬蟲成功。備好紙巾,快快去感受尊上和小骨的虐戀吧。

5.總結

代碼還有很多改進的地方。例如文本中包含廣告的js代碼可以去除,還可以加上爬蟲進度顯示等等。實現這些功能需要包含正則表達式和os模塊知識,就不多說了,大家可以繼續完善。

來源:藥少敏

編輯 | 碼哥

圖片源於網絡,版權歸原作者所有

最後更新:2017-10-09 01:11:57

  上一篇:go python源碼閱讀筆記之GC
  下一篇:go 國慶去哪裏人最多?用 Python 抓取的熱力圖告訴你!