
作者:李曉飛
來(lái)源:Python 技術(shù)
爬蟲(chóng)程序想必大家都很熟悉了,隨便寫(xiě)一個(gè)就可以獲取網(wǎng)頁(yè)上的信息,甚至可以通過(guò)請(qǐng)求自動(dòng)生成 Python 腳本[1]。
最近我遇到一個(gè)爬蟲(chóng)項(xiàng)目,需要爬取網(wǎng)上的文章。感覺(jué)沒(méi)有什么特別的,但問(wèn)題是沒(méi)有限定爬取范圍,意味著沒(méi)有明確的頁(yè)面的結(jié)構(gòu)。
對(duì)于一個(gè)頁(yè)面來(lái)說(shuō),除了核心文章內(nèi)容外,還有頭部,尾部,左右列表欄等等。有的頁(yè)面框架用 div 布局,有的用 table,即使都用 div,不太的網(wǎng)站風(fēng)格和布局也不同。
但問(wèn)題必須解決,我想,既然搜索引擎抓取到各種網(wǎng)頁(yè)的核心內(nèi)容,我們也應(yīng)該可以搞定,拎起 Python, 說(shuō)干就干!
如何解決呢?
開(kāi)始想了一個(gè)取巧的方法,就是利用工具(wkhtmltopdf[2])將目標(biāo)網(wǎng)頁(yè)生成 PDF 文件。
好處是不必關(guān)心頁(yè)面的具體形式,就像給頁(yè)面拍了一張照片,文章結(jié)構(gòu)是完整的。
雖然 PDF 是可以源碼級(jí)檢索,但是,生成 PDF 有諸多缺點(diǎn):
耗費(fèi)計(jì)算資源多、效率低、出錯(cuò)率高,體積太大。
幾萬(wàn)條數(shù)據(jù)已經(jīng)兩百多G,如果數(shù)據(jù)量上來(lái)光存儲(chǔ)就是很大的問(wèn)題。
不生成PDF,有簡(jiǎn)單辦法就是通過(guò) xpath[3] 提取頁(yè)面上的所有文字。
但是內(nèi)容將失去結(jié)構(gòu),可讀性差。更要命的是,網(wǎng)頁(yè)上有很多無(wú)關(guān)內(nèi)容,比如側(cè)邊欄,廣告,相關(guān)鏈接等,也會(huì)被提取下來(lái),影響內(nèi)容的精確性。
為了保證有一定的結(jié)構(gòu),還要識(shí)別到核心內(nèi)容,就只能識(shí)別并提取文章部分的結(jié)構(gòu)了。像搜索引擎學(xué)習(xí),就是想辦法識(shí)別頁(yè)面的核心內(nèi)容。
我們知道,通常情況下,頁(yè)面上的核心內(nèi)容(如文章部分)文字比較集中,可以從這個(gè)地方著手分析。
于是編寫(xiě)了一段代碼,我是用 Scrapy[4] 作為爬蟲(chóng)框架的,這里只截取了其中提取文章部分的代碼 :
divs = response.xpath("body//div")
sel = None
maxvalue = 0 for d in divs:
ds = len(d.xpath(".//div"))
ps = len(d.xpath(".//p")) value = ps - ds if value > maxvalue:
sel = { "node": d, "value": value }
maxvalue = value print("".join(sel['node'].getall()))
簡(jiǎn)單明了,測(cè)試了幾個(gè)頁(yè)面確實(shí)挺好。
不過(guò)大量提取時(shí)發(fā)現(xiàn),很多頁(yè)面提取不到數(shù)據(jù)。仔細(xì)查看發(fā)現(xiàn),有兩種情況。
再調(diào)整了一下策略,不再區(qū)分 div,查看所有的元素。
另外優(yōu)先選擇更多的 p,在其基礎(chǔ)上再看更少的 div。調(diào)整后的代碼如下:
divs = response.xpath("body//*")
sels = []
maxvalue = 0 for d in divs:
ds = len(d.xpath(".//div"))
ps = len(d.xpath(".//p")) if ps >= maxvalue:
sel = { "node": d, "ps": ps, "ds": ds
}
maxvalue = ps
sels.append(sel)
sels.sort(lambda x: x.ds)
sel = sels[0] print("".join(sel['node'].getall()))
經(jīng)過(guò)這樣修改之后,確實(shí)在一定程度上彌補(bǔ)了前面的問(wèn)題,但是引入了一個(gè)更麻煩的問(wèn)題。
就是找到的文章主體不穩(wěn)定,特別容易受到其他部分有些 p 的影響。
既然直接計(jì)算不太合適,需要重新設(shè)計(jì)一個(gè)算法。
我發(fā)現(xiàn),文字集中的地方是往往是文章主體,而前面的方法中,沒(méi)有考慮到這一點(diǎn),只是機(jī)械地找出了最大的 p。
還有一點(diǎn),網(wǎng)頁(yè)結(jié)構(gòu)是個(gè)顆 DOM 樹(shù)[6]
那么越靠近 p 標(biāo)簽的地方應(yīng)該越可能是文章主體,也就是說(shuō),計(jì)算是越靠近 p 的節(jié)點(diǎn)權(quán)值應(yīng)該越大,而遠(yuǎn)離 p 的結(jié)點(diǎn)及時(shí)擁有很多 p 但是權(quán)值也應(yīng)該小一點(diǎn)。
經(jīng)過(guò)試錯(cuò),最終代碼如下:
def find(node, sel): value = 0 for n in node.xpath("*"): if n.xpath("local-name()").get() == "p":
t = "".join([s.strip() for s in (n.xpath('text()').getall() + n.xpath("*/text()").getall())]) value += len(t) else: value += find(n, a)*0.5 if value > sel["value"]:
sel["node"] = node
sel["value"] = value return value sel = { 'value': 0, 'node': None
}
find(response.xpath("body"), sel)
通過(guò)這樣改造之后,效果特別好。
為什么呢?其實(shí)利用了密度原理,就是說(shuō)越靠近中心的地方,密度越高,遠(yuǎn)離中心的地方密度成倍的降低,這樣就能篩選出密度中心了。
50% 的坡度比率是如何得到的呢?
其實(shí)是通過(guò)實(shí)驗(yàn)確定的,剛開(kāi)始時(shí)我設(shè)置為 90%,但結(jié)果時(shí) body 節(jié)點(diǎn)總是最優(yōu)的,因?yàn)?nbsp;body 里包含了所有的文字內(nèi)容。
反復(fù)實(shí)驗(yàn)后,確定 50% 是比較好的值,如果在你的應(yīng)用中不合適,可以做調(diào)整。
描述了我如何選取文章主體的方法后,后沒(méi)有發(fā)現(xiàn)其實(shí)很是很簡(jiǎn)單的方法。而這次解決問(wèn)題的經(jīng)歷,讓我感受到了數(shù)學(xué)的魅力。
一直以來(lái)我認(rèn)為只要了解常規(guī)處理問(wèn)題的方式就足以應(yīng)對(duì)日常編程了,可以當(dāng)遇到不確定性問(wèn)題,沒(méi)有辦法抽取出簡(jiǎn)單模型的問(wèn)題時(shí),常規(guī)思維顯然不行。
所以平時(shí)我們應(yīng)該多看一些數(shù)學(xué)性強(qiáng)的,解決不確定性問(wèn)題的方法,以便提高我們的編程適應(yīng)能力,擴(kuò)展我們的技能范圍。
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶(hù) ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢(xún)到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢(xún)結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢(xún)結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03