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