用python實現常規的靜態網頁抓取時,往往是用urllib2來獲取整個html頁面,然後從html檔案中逐字查詢對應的關鍵字。如下所示:
#encoding=utf-8
import但是,在動態頁面中,所顯示的內容往往不是通過html頁面呈現的,而是通過呼叫js等方式從資料庫中得到資料,回顯到網頁上。urllib2
url="
"up=urllib2.urlopen(url)#
開啟目標頁面,存入變數up
cont=up.read()#
從up中讀入該html檔案
key1='
'#設定
關鍵字1
key2="
target
"#設定
關鍵字2
pa=cont.find(key1)#
找出關鍵字1的位置
pt=cont.find(key2,pa)#
找出關鍵字2的位置(從字1後面開始查詢)
urlx=cont[pa:pt]#
得到關鍵字1與關鍵字2之間的內容(即想要的資料)
print urlx
以*****上的「備案資訊」(為例,要抓取此頁面中的某些備案專案。例如「
那麼,在瀏覽器中開啟此頁面:
相關資訊都顯示的很全了,但是如果按照之前的辦法:
up=urllib2.urlopen(url)就抓取不到上述內容了。cont=up.read()
我們檢視一下這個頁面對應的原始碼:
由原始碼可以看出,這個《備案確認書》屬於「填空」形式的,html提供文字模板,js根據不同的id提供不同的變數,「填入」到文字模板中,形成了乙個具體的《備案確認書》。所以單純抓取此html,只能得到一些文字模板,而無法得到具體內容。
那麼,該如何找到那些具體內容呢?可以利用chrome的「開發者工具」來尋找誰是真正的內容提供者。
開啟chrome瀏覽器,按下鍵盤f12即可撥出此工具。如下圖:
此時選中「network」標籤,在位址列中輸入此頁面「瀏覽器會分析出此次響應的全過程,而紅框內的檔案,就是此次響應中,瀏覽器和web後端的所有通訊。
因為要獲得不同企業對應的不同資訊,那麼瀏覽器傳送給伺服器的請求裡面一定會有乙個和當前企業id有關的引數。
那麼,引數是多少呢?url上有,是「jsp?id=162518」,問號表示要呼叫引數,後面跟的是id號即是被呼叫的引數。而通過對這幾個檔案的分析,很顯然,企業資訊存在於「indexinvestment.action」檔案中。
然而,雙擊開啟此檔案並不能獲得企業資訊,而是一堆**。因為沒有對應的引數為它指明要顯示第幾號的資訊。如圖:
那麼,應該如何將引數傳遞給它呢?這時我們仍舊看f12視窗:
「header」一欄中明確地顯示出了此次響應的過程:
對目標url,用post的方式,傳遞了乙個id為162518的引數。
我們先手工操作一下。js是如何呼叫引數的呢?對,上面說過:問號+變數名+等號+變數對應的數字。
也就是說,向「這個頁面提交id為162518的引數時,應該在url後面加上
「?id=162518
」,即「
我們把這個url貼上到瀏覽器中來看:
似乎有了點內容,可是都是亂碼啊,怎麼破?熟悉的朋友可能一眼就看出來,這是編碼的問題。是因為響應回來的內容與瀏覽器預設的編碼方式不同。只需要在chrome右上角選單——更多工具——編碼——「自動檢測」即可。(其實這是utf-8的編碼,而chrome預設的是中文簡體)。如下圖:
好了,真正的資訊源已經被挖出,剩下的就是用python處理這些頁面上的字串,然後剪下、拼接,重新組成新的《專案備案書》了。
再然後使用for、while等迴圈,批量獲取這些《備案書》。
正如「不論是靜態網頁,動態網頁,模擬登陸等,都要先分析、搞懂邏輯,再去寫**」所說,程式語言只是乙個工具,重要的是解決問題的思路。有了思路,再尋找趁手的工具去解決,就ok了。
**
python結合mitmproxy抓包實踐
下面開始編寫 python指令碼抓取剛才上面那個包含加密引數的請求url位址,指令碼內容儲存在mitm addons.py檔案中。filter host www.iesdouyin.com 目標主機 url paths web api v2 aweme post user id 網頁 路徑指紋 對上...
http協議和Chrome抓包工具
http協議 全稱是hypertext transfer protocol,中文意思是超文字傳輸協議,是一種發布和接收html頁面的方法。伺服器端口號是80埠。https協議 是http協議的加密版本,在http下加入了ssl層。伺服器端口號是443埠。當使用者在瀏覽器的位址列中輸入乙個url並按回...
http協議和Chrome抓包工具
http協議 全稱是hypertext transfer protocol,中文意思是超文字傳輸協議,是一種發布和接收html頁面的方法。伺服器端口號是80埠。https協議 是http協議的加密版本,在http下加入了ssl層。伺服器端口號是443埠。當使用者在瀏覽器的位址列中輸入乙個url並按回...