作者 | 喵叔
責(zé)編 | 胡巍巍
出品 | CSDN(ID:CSDNnews)
爬蟲應(yīng)用的廣泛,例如搜索引擎、采集數(shù)據(jù)、廣告過濾、數(shù)據(jù)分析等。當(dāng)我們對少數(shù)網(wǎng)站內(nèi)容進(jìn)行爬取時寫多個爬蟲還是有可能的,但是對于需要爬取多個網(wǎng)站內(nèi)容的項目來說是不可能編寫多個爬蟲的,這個時候我們就需要智能爬蟲。
智能爬蟲目前有三種:
1. 基于網(wǎng)頁內(nèi)容的爬蟲
當(dāng)網(wǎng)頁含有大量需要提取的信息時,我們就需要用到基于網(wǎng)頁內(nèi)容的爬蟲。該爬蟲會將 html 視為文本并利用 NLP 技術(shù)進(jìn)行處理。
雖然說這種基于網(wǎng)頁內(nèi)容的爬蟲可以減少爬蟲的數(shù)量,但是需要人工參與進(jìn)行訓(xùn)練 NLP 模型,沒有 AI 開發(fā)經(jīng)驗或 AI 開發(fā)經(jīng)驗很少的程序員很難寫出這類爬蟲,并且爬蟲爬取時間很長效率還很低。
2. 基于DOM結(jié)構(gòu)的爬蟲
基于DOM結(jié)構(gòu)的爬蟲相對來說比較簡單,就是將 HTML 解析為 DOM 樹,然后根據(jù)語法結(jié)構(gòu)進(jìn)行提取信息,這種方法效率和準(zhǔn)確性都比前一種方法高。
3. 基于視覺的爬蟲
基于視覺的爬蟲的開發(fā)難度同樣很高,它是通過瀏覽器接口或者瀏覽器內(nèi)核對目標(biāo)頁面進(jìn)行袁燃,然后基于網(wǎng)頁的視覺規(guī)律提取網(wǎng)頁數(shù)據(jù)。這種爬蟲需要利用神經(jīng)網(wǎng)絡(luò)中的 CNN 卷積神經(jīng)網(wǎng)絡(luò)獲取頁面特定區(qū)域的內(nèi)容。
目前比較常用的只能爬蟲框架是 Readability 和 Newspaper 。下面我們就來看一下這兩個框架的講解。
1.Newspaper
Newspaper 是一個利用 NLP 的智能爬蟲框架,可以從頁面中提取出很多內(nèi)容。安裝這個爬蟲框架需要首先安裝依賴:
shell
sudo apt-get install libxml2-dev libxslt-dev
sudo apt-get install libjpeg-dev zlib1g-dev libpng12-dev
在上述安裝中如果出現(xiàn) libpng12-dev 出現(xiàn)錯誤,就需要安裝 libpng-dev 。
接下來就需要安裝 NLP 語料庫:
shell
curl https://raw.githubusercontent.com/codelucas/newspaper/master/download_corpora.py | Python3
最后我們安裝 Newspaper 爬蟲框架:
shell
pip install newspaper3k
下面我們就通過一個例子來看一下 newspaper 框架怎么使用:
python
from newspaper import Article
url = 'https://www.ithome.com/0/445/071.htm'
article = Article(url, language='zh')
article.download
article.parse
print('作者', article.authors)
print('標(biāo)題', article.title)
print('發(fā)布日期', article.publish_date)
print('正文', article.text)
article.nlp
print('關(guān)鍵詞', article.keywords)
print('摘要', article.summary)
上述代碼中 language='zh' 告訴 newspaper 我們抓取的是中文網(wǎng)頁。newspaper 會首先下載頁面,然后利用 parse 方法解析頁面。頁面解析后就可以獲取到作者、標(biāo)題、發(fā)布日期等內(nèi)容,如果要提取關(guān)鍵字和摘要,就可以使用 nlp 方法。
我利用多個不同網(wǎng)站的 URL 進(jìn)行測試發(fā)現(xiàn),部分內(nèi)容的作者和發(fā)布日期會解析不出來,有些內(nèi)容甚至獲取的不正確,但是對于英文內(nèi)容還是識別率很高的。如果要提高對中文的識別率,可以更換 newspaper 中的使用的分詞庫(目前 newspaper 使用的分詞庫是結(jié)巴分詞),或者改變所使用的內(nèi)容識別模型。
2.Readability
Readability 是一個爬蟲算法,它在 python 中的名稱叫 readability-lxml 同樣我們也可以通過 pip 命令來安裝:
shell
pip install readability-lxml
安裝完之后我們只需導(dǎo)入 readability 即可,我們來看一下例子:
python
import requests
from readability import Document
url = "https://www.ithome.com/0/444/503.htm"
html = requests.get(url).content
doc = Document(html)
print("title:", doc.title)
print("content:", doc.summary(html_partial=True))
這里我們使用 requests 庫請求頁面,然后將獲取到的 html 內(nèi)容傳遞給 readability 中的 Document 類,接著我們調(diào)用了 title 和 summary 方法來獲取標(biāo)題和正文。這樣我們就獲取到了標(biāo)題和正文。
summary 方法中的 html_partial 意思是石否過濾掉返回結(jié)果中的 html 和 body 標(biāo)簽。readability 所返回的正文內(nèi)容會有很大的可能包含頁面 html 元素,這就需要我們進(jìn)行二次過濾或提取。
readability 獲取 title 的方法很簡單,就是直接獲取頁面 title 元素中的內(nèi)容,但是獲取正文的方法就麻煩了,它是給每個節(jié)點打分,比如遇到 article 元素就會加上 5 分(源碼中就是加上5 分),因為 article 元素有可能是正文內(nèi)容或正文內(nèi)容的一部分。
如果遇到 ol 元素就意味著它有可能不是正文內(nèi)容,因此減掉3分,最后得分最高的那個元素就很有可能是正文或者正文內(nèi)容。
當(dāng)然 readability 還存在利用正則表達(dá)式來進(jìn)行打分的方式,這種方式的效果和上一種方式的效果幾乎一樣。簡單點說 readability 的原理就是根據(jù)經(jīng)驗積累設(shè)置出的模型,分?jǐn)?shù)也是根據(jù)敬仰不斷優(yōu)化得到的結(jié)果,因此這個框架的準(zhǔn)確的不是很高,但是可以解放一些人手。
3.總結(jié)和風(fēng)險預(yù)防
我們講解了常見的三種智能爬蟲類型,還通過代碼的形式學(xué)習(xí)了 newspaper 和 readability 的使用方法和原理,我們可以利用這篇文章學(xué)到的內(nèi)容來編寫自己的爬蟲,同時對爬蟲的開發(fā)有了更進(jìn)一步的了解。
爬蟲目前處于法律的灰色地帶,用好了會給個人/公司帶來很大的收益,反之會給個人/公司帶來法律風(fēng)險。因此我們在使用爬蟲的時候必須要遵循目標(biāo)網(wǎng)站 robots.txt 文件中的規(guī)定,同時也要控制爬蟲對目標(biāo)網(wǎng)站的爬取速度和頻率,防止對目標(biāo)網(wǎng)站造成壓力,甚至破壞數(shù)據(jù)信息。
作者簡介:朱鋼,筆名喵叔,CSDN博客專家,.NET高級開發(fā)工程師,7年一線開發(fā)經(jīng)驗,參與過電子政務(wù)系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構(gòu)設(shè)計,目前就職于北京恒創(chuàng)融慧科技發(fā)展有限公司,從事企業(yè)級安全監(jiān)控系統(tǒng)的開發(fā)。
【END】