知識就像碎布,記得「縫一縫」,你才能華麗麗地亮相。
1.Beautiful Soup
1.Beautifulsoup 簡介
此次實戰從網上爬取小說,需要使用到Beautiful Soup。
Beautiful Soup為python的第三方庫,可以幫助我們從網頁抓取數據。
它主要有如下特點:
2.Beautiful Soup安裝
win命令行下:
pip install beautifusoup4
3.Beautiful Soup基礎
大家可以參考文檔來學習(中文版的哦):http://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打開審查元素菜單。可以看到網頁前端的內容都包含在這裡。
我們的目的是要找到所有目錄的對應連結地址,爬取每個地址中的文本內容。
有耐心的朋友可以在裡面找到對應的章節目錄內容。有一個簡便方法是點擊審查元素中左上角箭頭標誌的按鈕,然後選中相應元素,對應的位置就會加深顯示。
這樣我們可以看到,每一章的連結地址都是有規則地存放在<li>中。而這些<li>又放在<div id=」book_detail」 class=」box1″>中。
我不停地強調「我們的目的」是要告訴大家,思路很重要。爬蟲不是約pao,蒙頭就上不可取。
3.單章節爬蟲
剛才已經分析過網頁結構。我們可以直接在瀏覽器中打開對應章節的連結地址,然後將文本內容提取出來。
我們要爬取的內容全都包含在這個<div>裡面。
代碼整理如下:
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
# 第8章的網址
url = 'http://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.解析目錄頁
在思路分析中,我們已經了解了目錄頁的結構。所有的內容都放在一個所有的內容都放在一個<div id=」book_detail」 class=」box1″>中。
這兒有兩個一模一樣的<div id=」book_detail」 class=」box1″>。
第一個<div>包含著最近更新的章節,第二個<div>包含著全集內容。
請注意,我們要爬取的是第二個<div>中的內容。
代碼整理如下:
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
# 目錄頁
url = 'http://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找到第二個<div>
soup_texts = soup.find('div', id = 'book_detail', class_= 'box1').find_next('div')
# 遍歷ol的子節點,列印出章節標題和對應的連結地址
for link in soup_texts.ol.children:
if link != '\n':
print(link.text + ': ', link.a.get('href'))
執行結果如圖:
2.爬取全集內容
將每個解析出來的連結循環代入到url中解析出來,並將其中的文本爬取出來,並且寫到本地F:/huaqiangu.txt中。
代碼整理如下:
from urllib import request
from bs4 import BeautifulSoup
if __name__ == '__main__':
url = 'http://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')
# 循環解析連結地址
for link in soup_texts.ol.children:
if link != '\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模塊知識,就不多說了,大家可以繼續完善。
來源:segmentfault.com/a/1190000010895903
--------
明明共同關注公眾號,彼此卻互不認識;
明明具有相同的愛好,卻無緣相識;
有沒有覺得這就是上帝給我們的一個bug!
想不想認識更多寫程序的小夥伴?
C++,Java,VB……應有盡有。
還等什麼?趕快上車加入我們吧!
(・ิϖ・ิ)っ算法與數學之美-計算機粉絲群
我們在這裡等你喲
算法數學之美微信公眾號歡迎賜稿
稿件涉及數學、物理、算法、計算機、編程等相關領域。
稿件一經採用,我們將奉上稿酬。
投稿郵箱:math_alg@163.com