老方最近有個(gè)任務(wù)涕刚,是抓取某網(wǎng)站內(nèi)容嗡综。網(wǎng)絡(luò)爬蟲(chóng)是python的拿手好戲,scrapy項(xiàng)目廣為流傳就是明證杜漠。
因?yàn)樵撊蝿?wù)只分析一個(gè)特定的網(wǎng)頁(yè)察净,所以選擇自已碼,碼完對(duì)過(guò)程中的一些要點(diǎn)記個(gè)筆記盼樟,主要包括:
- 通過(guò)圖形驗(yàn)證碼氢卡,OCR不花錢(qián)
- 正則表達(dá)式解析網(wǎng)頁(yè),多行晨缴、多分組
- 依賴(lài)包安裝避坑
以下筆記展開(kāi)
1. 不花錢(qián)的OCR如何選擇
也看了百度的paddle-ocr译秦,最終還是選了pytesseract。
- 識(shí)別率基本過(guò)關(guān):對(duì)于簡(jiǎn)單的圖形驗(yàn)證碼击碗,略做變換處理筑悴,識(shí)別率可以達(dá)到80%。20%會(huì)出錯(cuò)稍途,通過(guò)多取幾次圖片阁吝,總歸能蒙混過(guò)關(guān)。
-
依賴(lài)多晰房,但尚可搞定:pytesseract本身是個(gè)挺大的安裝包求摇,再加圖片處理用的opencv、顯示圖片做調(diào)試的matplotlib殊者,各自又帶了一串依賴(lài)与境,整個(gè)site-packages目錄看起來(lái)臃腫不堪。好在網(wǎng)上各類(lèi)教程詳盡猖吴,安裝過(guò)程還算順利摔刁。相比之下,paddle-ocr的宣傳資料各種炫酷海蔽,但教程看得人望而卻步
一堆的依賴(lài)
2. 正則表達(dá)式解析網(wǎng)頁(yè)的坑
爬下來(lái)的網(wǎng)頁(yè)要提取內(nèi)容共屈,這算是爬蟲(chóng)的基本操作吧。
一開(kāi)始我用的是BeautifulSoup党窜,可以直接在文本中按照標(biāo)簽拗引、class等檢索元素,然后再做屬性的提取幌衣。但發(fā)現(xiàn)這貨不支持xpath矾削,所以要直接取特定的對(duì)象并不方便,往往要分成好幾步豁护。
改用lxml哼凯,xpath定位提取指哪打哪兒,得心應(yīng)手楚里。不過(guò)剛巧標(biāo)簽里面有個(gè)內(nèi)容是/分隔的數(shù)字断部,還得再寫(xiě)代碼拆分一下。
因?yàn)樘崛〉膬?nèi)容不算復(fù)雜班缎,re又是python的內(nèi)置庫(kù)蝴光,所以想想就干脆棄了兩個(gè)成熟的三方庫(kù)她渴,自己用正則表達(dá)式來(lái)試試。下面是取表格行的代碼:
re.findall('<TR.*?>(.*?<td.*?)</TR>', html, flags=re.MULTILINE|re.DOTALL)
貌似有點(diǎn)復(fù)雜虱疏。python官網(wǎng)關(guān)于正則的howto文檔還是很詳盡的惹骂,主要有幾個(gè)問(wèn)題要注意:
- 換行處理:正則默認(rèn)處理單行文本,而html里面的一對(duì)標(biāo)簽之間的內(nèi)容往往有換行做瞪,比如<tr></tr>之間有好幾個(gè)單元格对粪,一般都會(huì)有好幾個(gè)換行(newline),查找函數(shù)末尾要加上一個(gè)MULTILINE装蓬。"."這個(gè)符號(hào)能夠匹配所有的字符著拭,但默認(rèn)不包括換行符,所以要加一個(gè)DOTALL牍帚。
- 防止貪婪匹配:比如<TR.?>儡遮,在通配符后加上?暗赶,不然會(huì)一口氣找到最后一個(gè)>符號(hào)為止鄙币。
??正則表達(dá)式,老方個(gè)人比較偏愛(ài)蹂随,因?yàn)樵诤芏鄨?chǎng)合下十嘿,語(yǔ)法都是兼容的,可謂:學(xué)習(xí)一次岳锁、走遍天下绩衷。比如word辦公軟件可以拿來(lái)查找替換、前端可以拿來(lái)校驗(yàn)手機(jī)號(hào)碼激率、寫(xiě)代碼的IDE中也可以精確替換咳燕。
依賴(lài)包安裝
首先要升級(jí)pip。
比如pytesseract的python庫(kù)最少得pip9.3乒躺,而python3.8自帶的版本低了招盲,直接安裝會(huì)拋出一堆的錯(cuò)誤。
升級(jí)pip嘉冒,得用easy_install -U pip宪肖,通過(guò)pip自已來(lái)升級(jí)總是報(bào)錯(cuò)。
用國(guó)內(nèi)的鏡像
這一點(diǎn)我每次都會(huì)忘記健爬,國(guó)內(nèi)的鏡像速度快很多,畢竟這些依賴(lài)包有幾百M(fèi)么介。
pip install pytesseract -i https://mirrors.aliyun.com/pypi/simple/
娜遵。。壤短。
opencv有四個(gè)版本设拟,我不需要GUI的功能慨仿,所以選了headless的版本,尺寸小一點(diǎn)纳胧。