用Python實現(xiàn)常規(guī)的靜態(tài)網(wǎng)頁抓取時,往往是用urllib2來獲取整個HTML頁面,然后從HTML文件中逐字查找對應的關鍵字。如下所示:
代碼如下:
import urllib2
url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1"
up=urllib2.urlopen(url)#打開目標頁面,存入變量up
cont=up.read()#從up中讀入該HTML文件
key1='<a href="http'#設置關鍵字1
key2="target"#設置關鍵字2
pa=cont.find(key1)#找出關鍵字1的位置
pt=cont.find(key2,pa)#找出關鍵字2的位置(從字1后面開始查找)
urlx=cont[pa:pt]#得到關鍵字1與關鍵字2之間的內(nèi)容(即想要的數(shù)據(jù))
print urlx
但是,在動態(tài)頁面中,所顯示的內(nèi)容往往不是通過HTML頁面呈現(xiàn)的,而是通過調(diào)用js等方式從數(shù)據(jù)庫中得到數(shù)據(jù),回顯到網(wǎng)頁上。以發(fā)改委網(wǎng)站上的“備案信息”(http://beian.hndrc.gov.cn/)為例,要抓取此頁面中的某些備案項目。例如“http://beian.hndrc.gov.cn/indexinvestment.jsp?id=162518”。
那么,在瀏覽器中打開此頁面:
相關信息都顯示的很全了,但是如果按照之前的辦法:
代碼如下:
up=urllib2.urlopen(url)
cont=up.read()
就抓取不到上述內(nèi)容了。
我們查看一下這個頁面對應的源碼:
由源碼可以看出,這個《備案確認書》屬于“填空”形式的,HTML提供文字模板,js根據(jù)不同的id提供不同的變量,“填入”到文字模板中,形成了一個具體的《備案確認書》。所以單純抓取此HTML,只能得到一些文字模板,而無法得到具體內(nèi)容。
那么,該如何找到那些具體內(nèi)容呢?可以利用Chrome的“開發(fā)者工具”來尋找誰是真正的內(nèi)容提供者。
打開Chrome瀏覽器,按下鍵盤F12即可呼出此工具。如下圖:
此時選中“Network”標簽,在地址欄中輸入此頁面“http://beian.hndrc.gov.cn/indexinvestment.jsp?id=162518”,瀏覽器會分析出此次響應的全過程,而紅框內(nèi)的文件,就是此次響應中,瀏覽器和web后端的所有通信。
因為要獲得不同企業(yè)對應的不同信息,那么瀏覽器發(fā)送給服務器的請求里面一定會有一個和當前企業(yè)id有關的參數(shù)。
那么,參數(shù)是多少呢?URL上有,是“jsp?id=162518”,問號表示要調(diào)用參數(shù),后面跟的是id號即是被調(diào)用的參數(shù)。而通過對這幾個文件的分析,很顯然,企業(yè)信息存在于“indexinvestment.action”文件中。
然而,雙擊打開此文件并不能獲得企業(yè)信息,而是一堆代碼。因為沒有對應的參數(shù)為它指明要顯示第幾號的信息。如圖:
新聞熱點
疑難解答
圖片精選