本文主要和大家分享python動態爬蟲的實例分享,用Python實現常規的靜態網頁抓取時,往往是用urllib2來獲取整個HTML頁面,然後從HTML文件中逐字查找對應的關鍵字。如下所示:
#encoding=utf-8
import urllib2 url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1"up=urllib2.urlopen(url)#打开目标页面,存入变量upcont=up.read()#从up中读入该HTML文件key1='<a href="http'#设置关键字1key2="target"#设置关键字2pa=cont.find(key1)#找出关键字1的位置pt=cont.find(key2,pa)#找出关键字2的位置(从字1后面开始查找)urlx=cont[pa:pt]#得到关键字1与关键字2之间的内容(即想要的数据)print urlx
但是,在動態頁面中,所顯示的內容往往不是透過HTML頁面呈現的,而是透過呼叫js等方式從資料庫中得到數據,回顯到網頁上。
以發改委網站上的「備案資訊」(http://beian.hndrc.gov.cn/)為例,要抓取此頁面中的某些備案項目。例如「http://beian.hndrc.gov.cn/indexinvestment.jsp?id=162518」。
那麼,在瀏覽器中開啟此頁面:
#相關資訊都顯示的很全了,但是如果按照先前的方法:
up=urllib2.urlopen(url) cont=up.read()
就抓取不到上述內容了。
我們來看看這個頁面對應的源碼:
由原始碼可以看出,這個《備案確認書》屬於「填空」形式的,HTML提供文字模板,js根據不同的id提供不同的變量,「填入」到文字模板中,形成了一個具體的《備案確認書》。所以單純抓取此HTML,只能得到一些文字模板,而無法得到具體內容。
那麼,該如何找到那些具體內容呢?可以利用Chrome的「開發者工具」來尋找誰是真正的內容提供者。
開啟Chrome瀏覽器,按下鍵盤F12即可呼出此工具。如下圖:
此時選取「Network」標籤,在網址列輸入此頁面「http://beian.hndrc.gov.cn/indexinvestment.jsp? id=162518”,瀏覽器會分析出此次回應的全過程,而紅框內的文件,就是此次回應中,瀏覽器和web後端的所有通訊。
因為要取得不同企業對應的不同訊息,那麼瀏覽器傳送給伺服器的請求裡面一定會有一個和目前企業id相關的參數。
那麼,參數是多少呢? URL上有,是“jsp?id=162518”,問號表示要呼叫參數,後面跟的是id號就是被呼叫的參數。而透過這幾個文件的分析,很顯然,企業資訊存在於「indexinvestment.action」文件中。
然而,雙擊開啟此檔案並不能獲得企業訊息,而是一堆程式碼。因為沒有對應的參數為它指明要顯示第幾號的資訊。如圖:
那麼,應該如何將參數傳遞給它呢?這時我們仍舊看F12視窗:
「Header」一欄中明確地顯示出了此次回應的過程:
對目標URL,用POST的方式,傳遞了一個id為162518的參數。
我們先手動操作一下。 js是如何呼叫參數的呢?對,上面說過:問號+變數名+等號+變數對應的數字。也就是說,向“http://beian.hndrc.gov.cn/indexinvestment.action”這個頁面提交id為162518的參數時,應該在URL後面加上
“?id=162518” ,即
「http://beian.hndrc.gov.cn/indexinvestment.action?id=162518」。
我們把這個URL貼到瀏覽器中來看:
#似乎有了點內容,可是都是亂碼啊,怎麼破?熟悉的朋友可能一眼就看出來,這是編碼的問題。是因為回應回來的內容與瀏覽器預設的編碼方式不同。只需要在Chrome右上角選單——更多工具——編碼——「自動偵測」即可。 (其實這是UTF-8的編碼,而Chrome預設的是中文簡體)。如下圖:
好了,真正的資訊來源已經被挖出,剩下的就是用Python處理這些頁面上的字串,然後剪切、拼接,重新組成新的《專案備案書》了。
再然後使用for、while等循環,批次取得這些《備案書》。
正如「不論是靜態網頁,動態網頁,模擬登陸等,都要先分析、搞懂邏輯,再寫程式碼」所說,程式語言只是一個工具,重要的是解決問題的思路。有了思路,再尋找趁手的工具去解決,就OK了。
以上是python動態爬蟲的實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!