之前寫的一些爬蟲都是用的正則、bs4、xpath做為解析庫(kù)來(lái)實(shí)現(xiàn),如果你對(duì)web有所涉及,并且比較喜歡css選擇器,那么就有一個(gè)更適合的解析庫(kù)—— PyQuery。我們就用一個(gè)非常簡(jiǎn)單的小例子來(lái)看看css選擇器做爬蟲是怎么樣的!
安裝
直接pip安裝即可:pip install pyquery
安裝完成后,運(yùn)行 pip show pyquery,如果出現(xiàn)相關(guān)信息即為安裝完成!
如果pip安裝失敗,可以去官網(wǎng)https://pypi.org/project/pyquery/#downloads下載wheel文件,然后用pip安裝即可,注意文件名字要寫全,比如:pip install pyquery-1.2.17-py2.py3-none-any.whl ,該命令請(qǐng)?jiān)谕荒夸浵率褂谩?/p>
使用
確保安裝成功后就可以開(kāi)始使用了,它和其他庫(kù)一樣,PyQuery 初始化的時(shí)候也需要傳入 HTML 數(shù)據(jù)源來(lái)初始化一個(gè)操作對(duì)象,它的初始化方式有多種,比如直接傳入字符串,傳入 URL,傳文件名。
我們用requests庫(kù)搭配來(lái)寫個(gè)簡(jiǎn)單的抓取鳳凰新聞的小爬蟲,方便理解:
打開(kāi)鳳凰網(wǎng)——資訊——即時(shí)新聞,我們就以抓取這個(gè)頁(yè)面的所有新聞為例吧!
這里沒(méi)有反爬,頁(yè)數(shù)也不是很多(4頁(yè)),非常方便用來(lái)講解!分析下網(wǎng)頁(yè)結(jié)構(gòu)后發(fā)現(xiàn),所有的新聞目錄都存在于網(wǎng)頁(yè)源代碼中,每頁(yè)大概有60多條,我們先來(lái)抓取一頁(yè)的標(biāo)題和url試試
可以看到,標(biāo)題和url都在class=newsList的div下的ul->li->a標(biāo)簽下(用a標(biāo)簽的target屬性匹配的話太多,不好清洗),我們可以直接寫如代碼去獲取相關(guān)內(nèi)容了,如下圖:
前面是常規(guī)的requests庫(kù)獲取源代碼html,然后用PyQuery解析網(wǎng)頁(yè)源代碼,重點(diǎn)是后面的定位到a標(biāo)簽和取出內(nèi)容。
doc('.newsList ul a') 的意思是定位class屬性為newsList的標(biāo)簽下面的ul下面的a標(biāo)簽,注意newsList前面有個(gè)點(diǎn),代表class屬性,ul和a標(biāo)簽之間有個(gè)li標(biāo)簽,因?yàn)閡l下的a標(biāo)簽是唯一,所以省略了(ul標(biāo)簽沒(méi)有省略是因?yàn)樽钕旅娣?yè)部分也在這個(gè)div下,省略會(huì)有其他內(nèi)容出現(xiàn),下面會(huì)單獨(dú)提取)!然后定位到a標(biāo)簽后,用items()方法將所有的a標(biāo)簽取出,然后遍歷取出里面的內(nèi)容。
這里提取標(biāo)簽的內(nèi)容用了2個(gè)方法text()和attr():
text()方法,可以提取出標(biāo)簽下的所有文本內(nèi)容,注意是所有?。?!
attr()方法,取出標(biāo)簽的某屬性,2中寫法都可以:new.attr.href 和new.attr('href')
然后在看翻頁(yè),我們只需要判斷是否存在下一頁(yè),存在時(shí),查找所有的標(biāo)題和url,然后獲取下一頁(yè)的url,繼續(xù)查找,直到不存在下一頁(yè),所有的頁(yè)面就都遍歷過(guò)了!為了方便,直接做成了一個(gè)函數(shù),來(lái)看代碼
這里同樣的用class屬性來(lái)定位,找到它下的a標(biāo)簽,然后判斷‘下一頁(yè)’是否存在a標(biāo)簽的文本中,存在則取出下一頁(yè)的url,然后再次調(diào)用函數(shù),不存在則退出!
這樣,我們就得到了4頁(yè)所有的title和url的內(nèi)容,在來(lái)看看新聞詳情頁(yè)的情況,所有的網(wǎng)頁(yè)文本內(nèi)容都在id="main_content"的div下的好多p標(biāo)簽中,那么就用到了text()方法了!來(lái)看圖
這樣,我們就取到了所有內(nèi)容,整合下,最后代碼如下:
隨手寫的代碼,就不寫入文本或者數(shù)據(jù)庫(kù)什么了,主要是學(xué)習(xí)css選擇器的使用!
最后
到這里PyQuery 的用法就介紹完了,當(dāng)然只是用到了很少一部分,還有好多功能沒(méi)有在這里使用,大家有興趣可以去看看官方文檔或者教程,而且css選擇器也可以使用在scrapy框架!是非常方便的一種方式!