之前寫的一些爬蟲都是用的正則矿酵、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)容赡突,注意是所有!G浴惭缰!
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ù)庫什么了,主要是學習css選擇器的使用昌腰!
最后
?到這里PyQuery 的用法就介紹完了开伏,當然只是用到了很少一部分,還有好多功能沒有在這里使用遭商,大家有興趣可以去看看官方文檔或者教程固灵,而且css選擇器也可以使用在scrapy框架!是非常方便的一種方式劫流!
現(xiàn)在學習python的人越來越多巫玻,很多人還在找資料,或者疑問哪本書是否有用祠汇,或者想找個可以指導的老師仍秤,或者在尋找一起學習的小伙伴,如果你也是需要資料或者需要幫助的話可很,可以關(guān)注我诗力,私信一起來交流學習!