當當當~第三篇博客開始啦~
這次的話題是數據抓取。終於到了核心部分的探討,我的心情也是非常激動啊!如果大家baidu或者google(如果可以的話)數據抓取或者data crawling,將會找到數以千計的例子。但是大多數的代碼非常的冗長,並且許多代碼還是抓取靜態數據之后,對動態JS寫成的數據卻毫無辦法。或者,利用HTML解析網址后,再找到JS寫的數據頁面來尋找到所想要的數據。
但是!不知各位是否有發現過,如果打開chrome或者safari或者各種瀏覽器的審查元素。網頁上能看到的數據,其實都會載到里面。可當轉移到源代碼的時候,JS寫成的數據卻都消失了!可我們為什么要從源代碼中找數據,卻不直接從審查元素中找呢?帶着這個問題,我歷經千險,穿越了各種國外的社區論壇以及插件包,終於找到了答案。
首先介紹今天的主角!
- interpreter:Selenium
- app:PhantomJS
既然是interpreter,Selenium是可以按照我第一篇博客的做法下載的。PhantomJS呢,可以直接通過我給的鏈接里面進行下載。當兩個都安裝完畢,就能正式地開始進行數據抓取了。當然例子就是我的博客啦~
首先上范例代碼
#-*-coding:utf-8-*-#
from selenium import webdriver def crawling_webdriver(): #get local session of PhantomJS driver = webdriver.PhantomJS(executable_path='/Users/***/phantomjs/bin/phantomjs', port=65000) driver.set_window_size(1024, 768) #optional driver.get("http://www.cnblogs.com/Jerrold-Gao/") # Load page #start crawling data data=driver.find_element_by_id("sidebar_scorerank").text
#print to check my result print(data)
#quit the driver driver.quit() if __name__ == '__main__': crawling_webdriver()
是否有被python精簡的語言驚嘆到呢?這就是python插件功能包的強大之處。
我需要提醒幾個注意點:一、PhantomJS的路徑和端口是一定要尋找的。在國內某篇文章中不知為何去掉了路徑和端口,神奇的是,居然程序還能運行。我試了幾回,都無法像它一樣運行。二、請務必在最后quit driver,不然對內存的占用是會越來越大的。
這樣的代碼就可以對本頁面的數據進行抓取了,結果是:
可是,如果是想抓取超級鏈接呢?通過以上的代碼,依樣畫葫蘆,仍然是找不出來的。這里有個簡單的技巧:
#crawling a link data=driver.find_element_by_id("homepage1_HomePageDays_DaysList_ctl00_DayList_TitleUrl_0") url=data.get_attribute("href")
將id屬下的區塊,提取出href的部分,就能找到鏈接了。這里找到的是:
=================================這里是另起主題的分割線===================================
關於Selenium,無論是國內還是國外,都算火過一陣子了。比起openpyxl,它在主頁上的注釋也清晰很多。這里介紹幾個我覺得比較好用的資源。
由於它官網莫名掉線,所以首當其沖的資源就是python-Selenium站了,上面有很多對代碼的注解,十分實用。
其次,對國內的同學來說,最好的網站便是中文站了,雖然人數不是很多,但是討論還是挺豐富的。
最后,便是萬能的stackoverflow啦,國內上這個站速度總是有點慢,其實還是很怨念的。
=================================我是來返場的分割線======================================
本日吐槽:有次和友人逛博物館。朋友說,博物館其實好奸詐,一大面雪白的牆掛一幅畫,你看到畫后也不會立刻有比較對象,就會覺得“這好有藝術感啊”的奇妙感覺。我回答說,就和西歐的料理一樣嘛,一個大白盤擺一小疊食物,感覺就會很精致的。朋友深表贊同地說,對啊,這么大的留白,擺什么都好看。我低頭輕輕笑了一下,說,什么時候把我的代碼也掛上去。
在家隨便做的法式甜酒鴨胸肉(Magret de Canard)