首先,你去爬取一個(gè)網(wǎng)站,
你會(huì)清楚這個(gè)網(wǎng)站是屬于什么類(lèi)型的網(wǎng)站(新聞,論壇,貼吧等等)。
你會(huì)清楚你需要哪部分的數(shù)據(jù)。
你需要去想需要的數(shù)據(jù)你將如何編寫(xiě)表達(dá)式去解析。
你會(huì)碰到各種反爬措施,無(wú)非就是各種百度各種解決。當(dāng)爬取成本高于數(shù)據(jù)成本,你會(huì)選擇放棄。
你會(huì)利用你所學(xué)各種語(yǔ)言去解決你將要碰到的問(wèn)題,利用各種語(yǔ)言的client組件去請(qǐng)求你想要爬取的URL,獲取到HTML,利用正則,XPATH去解析你想要的數(shù)據(jù),然后利用sql存儲(chǔ)各類(lèi)數(shù)據(jù)庫(kù)。
Python 中可以進(jìn)行網(wǎng)頁(yè)解析的庫(kù)有很多,常見(jiàn)的有 和 lxml 等。在網(wǎng)上玩爬蟲(chóng)的文章通常都是介紹 這個(gè)庫(kù),我平常也是常用這個(gè)庫(kù),最近用 Xpath 用得比較多,使用 就不大習(xí)慣,很久之前就知道 Reitz 大神出了一個(gè)叫 Requests-HTML 的庫(kù),一直沒(méi)有興趣看,這回可算歹著機(jī)會(huì)用一下了。
使用 pip install requests-html 安裝,上手和 Reitz 的其他庫(kù)一樣,輕松簡(jiǎn)單:
這個(gè)庫(kù)是在 requests 庫(kù)上實(shí)現(xiàn)的,r 得到的結(jié)果是 Response 對(duì)象下面的一個(gè)子類(lèi),多個(gè)一個(gè) html 的屬性。所以 requests 庫(kù)的響應(yīng)對(duì)象可以進(jìn)行什么操作,這個(gè) r 也都可以。如果需要解析網(wǎng)頁(yè),直接獲取響應(yīng)對(duì)象的 html 屬性:
不得不膜拜 Reitz 大神太會(huì)組裝技術(shù)了。實(shí)際上 是繼承自 requests.Session 這個(gè)核心類(lèi),然后將 requests.Session 類(lèi)里的 requests 方法改寫(xiě),返回自己的一個(gè) 對(duì)象,這個(gè)類(lèi)又是繼承自 requests.Response,只是多加了一個(gè) _from_response 的方法來(lái)構(gòu)造實(shí)例:
之后在 里定義屬性方法 html,就可以通過(guò) html 屬性訪問(wèn)了,實(shí)現(xiàn)也就是組裝 PyQuery 來(lái)干。核心的解析類(lèi)也大多是使用 PyQuery 和 lxml 來(lái)做解析,簡(jiǎn)化了名稱(chēng),挺討巧的。
元素定位可以選擇兩種方式:
方法名非常簡(jiǎn)單,符合 Python 優(yōu)雅的風(fēng)格,這里不妨對(duì)這兩種方式簡(jiǎn)單的說(shuō)明:
定位到元素以后勢(shì)必要獲取元素里面的內(nèi)容和屬性相關(guān)數(shù)據(jù),獲取文本:
獲取元素的屬性:
還可以通過(guò)模式來(lái)匹配對(duì)應(yīng)的內(nèi)容:
這個(gè)功能看起來(lái)比較雞肋,可以深入研究?jī)?yōu)化一下,說(shuō)不定能在 github 上混個(gè)提交。
除了一些基礎(chǔ)操作,這個(gè)庫(kù)還提供了一些人性化的操作。比如一鍵獲取網(wǎng)頁(yè)的所有超鏈接,這對(duì)于整站爬蟲(chóng)應(yīng)該是個(gè)福音,URL 管理比較方便:
內(nèi)容頁(yè)面通常都是分頁(yè)的,一次抓取不了太多,這個(gè)庫(kù)可以獲取分頁(yè)信息:
結(jié)果如下:
通過(guò)迭代器實(shí)現(xiàn)了智能發(fā)現(xiàn)分頁(yè),這個(gè)迭代器里面會(huì)用一個(gè)叫 _next 的方法,貼一段源碼感受下:
通過(guò)查找 a 標(biāo)簽里面是否含有指定的文本來(lái)判斷是不是有下一頁(yè),通常我們的下一頁(yè)都會(huì)通過(guò) 下一頁(yè) 或者 加載更多 來(lái)引導(dǎo),他就是利用這個(gè)標(biāo)志來(lái)進(jìn)行判斷。默認(rèn)的以列表形式存在全局: ['next','more','older'] 。我個(gè)人認(rèn)為這種方式非常不靈活,幾乎沒(méi)有擴(kuò)展性。 感興趣的可以往 github 上提交代碼優(yōu)化。
也許是考慮到了現(xiàn)在 js 的一些異步加載,這個(gè)庫(kù)支持 js 運(yùn)行時(shí),官方說(shuō)明如下:
使用非常簡(jiǎn)單,直接調(diào)用以下方法:
*次使用的時(shí)候會(huì)下載 Chromium,不過(guò)國(guó)內(nèi)你懂的,自己想辦法去下吧,就不要等它自己下載了。render 函數(shù)可以使用 js 腳本來(lái)操作頁(yè)面,滾動(dòng)操作單獨(dú)做了參數(shù)。這對(duì)于上拉加載等新式頁(yè)面是非常友好的。
利用python爬取網(wǎng)頁(yè)內(nèi)容需要用scrapy(爬蟲(chóng)框架),但是很簡(jiǎn)單,就三步
定義item類(lèi)
開(kāi)發(fā)spider類(lèi)
開(kāi)發(fā)pipeline
想學(xué)習(xí)更深的爬蟲(chóng),可以用《瘋狂python講義》
只要一個(gè)電話
我們免費(fèi)為您回電