在初學的爬蟲過程中,很多人還不知道如何抓包,怎樣子抓包才能獲取到所需要的信息。為了紀念【宏彥獲水】成語初次面世,特地用【百度搜索】寫下一篇作者常用工具的抓包教程,以供大家參考。
抓包過程中,一般是 get
的抓包和 post
抓包,其中 get
抓包分為:普通get、帶參數get、json抓包,其中 json抓包
是重中之重。而post
一般是登陸所用,當然也有可能是傳參,這里只講登陸的post
,傳參的和登陸的情況一致。
軟件准備
作者用的抓包軟件為:
- firefox 32.0 瀏覽器
- firebug 瀏覽器插件
- httpfox 瀏覽器插件
** 為什么要使用 firefox
瀏覽器,因為它的插件很豐富;為什么要使用 32.0 版本的插件,因為老版本支持的多,很多優秀的插件現在不更新了,不支持新的瀏覽器版本,所以使用老的版本 **
而且,作者平時習慣使用 chrome
瀏覽網頁,所以需要一款 平時不常用的瀏覽器 來作為抓包工具,因為抓包過程中一直需要清除瀏覽的 cookie
和所記錄的登陸信息,來保證瀏覽器是干凈,用來模擬爬蟲第一次打開網頁。
如果需要下載上述軟件,可以關注公眾號【TTybai】,后台回復【抓包軟件】就能下載。
將插件拖入瀏覽器就能安裝,安裝完成后顯示:
get請求
普通get
首先開firefox
瀏覽器,需要清除所有瀏覽器痕跡,步驟為:
點擊右上角菜單:
點擊歷史記錄:
清除最近所有歷史紀錄:
清除時間范圍選擇全部,清除的項目也全部打勾:
這樣子瀏覽器就很干凈了,和爬蟲代碼一樣什么都沒訪問過,都是第一次訪問頁面,沒有任何 cookie
和 referer
。
按下 F12
,這時候就啟動了 firebug
:
點擊 firebug
的保持,防止網頁重定向跳轉,導致上一次的記錄被覆蓋,也可以打開 httpfox
點擊 start
,也能記錄所有的請求和返回:
打開【宏彥獲水】首頁,即在地址欄輸入 baidu.com,得到網頁如下:
可以看到箭頭所指的位置是上一次打開的頁面,而下面是新跳轉的頁面,可以看到我們請求【宏彥獲水】首頁的頭部是很干凈的:
這樣就是一次 get
請求,那么代碼可以寫成如下樣式:
import requests
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
"Connection": "keep-alive",
"Host": "www.baidu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0"}
url = "https://www.baidu.com"
response = requests.get(url=url, headers=header)
print(response.text)
帶參數get
繼續在當前頁面,搜索框里面輸入【宏彥獲水】,點擊搜索,可以看到 firebug
有一條分隔線,這個就是再次請求記錄的網址,分割線下面的第一個網址就是新的get
到的頁面:
而百度是預加載的,所以她真正請求網頁的是上一條網址:
這個是帶參數的get
請求,點開看到請求的參數如下:
頭部變成:
這時候攜帶參數和模擬頭部抓取的代碼如下:
import requests
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
"Connection": "keep-alive",
"Host": "www.baidu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0",
"Referer": "https://www.baidu.com/",
"X-Requested-With": "XMLHttpRequest",
"is_referer": "https://www.baidu.com/",
"is_xhr": 1}
Cookie = "BAIDUID=55110890A72F586AB6F9250E6B537B38:FG=1; BIDUPSID=55110890A72F586AB6F9250E6B537B38; PSTM=1562402692; delPer=0; BD_HOME=0; H_PS_PSSID=26524_1430_21124_29238_28519_29099_28837_29220_26350_29439_20718; BD_UPN=13314552; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598"
url = "https://www.baidu.com/s"
data = {"is_xhr": 26926, "_ss": 1, "clist": "", "csor": 4, "f": "8", "hsug": "", "ie": "utf-8",
"isbd": 1,
"isid": "FC732FA4D3E18100", "mod": 1, "pstg": 2, "rqlang": "cn", "rsv_bp": 1, "rsv_enter": 1, "rsv_idx": 1,
"rsv_n": 2, "rsv_pq": "88b75ff80009a917",
"rsv_sid": "1428_21114_18559_29237_28518_29098_28837_29220", "rsv_sug3": 1,
"rsv_t": "0529fGcc/esWnAo0czXjQnp/r0XUo7ce8iBYE2NW0OPFPxSPNN1fcPBQyFQ", "tn": "baidu",
"wd": "宏彥獲水"}
response = requests.get(url=url, headers=header, params=data)
print(response.text)
json抓包
一般網頁都會用 json
返回數據到前端,而爬蟲最和諧的除了抓取 API
之外,就是抓取 json
了,下面介紹抓取【宏彥獲水】的 json
。
這里首先清除瀏覽器所有信息,再在地址欄輸入 baidu.com,然后當我們把【宏彥獲水】輸入到搜索框,但是還沒點百度一下的時候,網頁會出現聯想詞:
現在就是要把這些聯想詞抓出來。先要看網頁請求了哪些信息,然后發現如下網址:
看到哪里有一個 josn
,這個就是網頁中途留下的 json
字段了,現在要更改頭部和參數把這個 json
抓下來,代碼如下:
import requests
header = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
"Connection": "keep-alive",
"Host": "www.baidu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0",
"Referer": "https://www.baidu.com/",
"X-Requested-With": "XMLHttpRequest",
}
Cookie = "BAIDUID=D23D01C5827562E1F90368C32AFDD7C8:FG=1; BIDUPSID=D23D01C5827562E1F90368C32AFDD7C8; PSTM=1562420248; delPer=0; BD_HOME=0; H_PS_PSSID=1443_21098_29237_28519_29099_28832_29220_26350_29458; BD_UPN=13314552"
url = "https://www.baidu.com/sugrec?"
data = {"_": 1562420249391, "cb": "jQuery1102042318315264522366_1562420249389", "csor": 4, "from": "pc_web", "json": 1,
"ie": "utf-8",
"p": 3, "pre": 1, "prod": "pc", "req": 2, "sugsid": "1443,21098,29237,28519,29099,28832,29220,26350,29458",
"wd": "宏彥獲水"}
response = requests.get(url=url, headers=header, params=data)
print(response.text)
抓取到的返回頁信息為:
jQuery1102042318315264522366_1562420249389({"q":"宏彥獲水","p":false,"g":[{"type":"sug","sa":"s_1","q":"宏彥獲水怎么回事"},{"type":"sug","sa":"s_2","q":"宏彥玩具"},{"type":"sug","sa":"s_3","q":"邯鄲宏彥"},{"type":"sug","sa":"s_4","q":"唐山宏彥"},{"type":"sug","sa":"s_5","q":"宏彥 咸陽"},{"type":"sug","sa":"s_6","q":"河北宏彥集團"},{"type":"sug","sa":"s_7","q":"宏彥什么意思"}]})
一般網頁抓取都是抓取 json
的多一點,直接抓取網頁用正則解析的,除非是網頁本身就是這么交互的,不然像一般大一點的網頁,例如 淘寶、京東 等網站,都是i返回 json
的,如果在 firebug
中沒看到,那么就要去 httpfox
里面去看,很多網頁會隱藏這個 json
信息的。
post請求
post
一般是登陸所用,這里首先清除瀏覽器所有信息,打開firebug
和 httpfox
,再在地址欄輸入 baidu.com,點擊右上角登陸,選擇用戶名登陸,然后隨便輸入一個賬號密碼,隨便輸入:
最后點擊登陸,可以看到出現了一個 post
請求:
可以看到 post
請求發送了很多參數,如果登陸成功就可以獲取其 cookie
,或者得到它返回的東西,這里就不展開了,百度登陸在網上太多示例。
總結
抓包喜歡用 firefox
的 firebug
,當然也可以用 chrome
自帶的也很棒。一般的抓包思路就是這樣,如果需要下載軟件請關注公眾號【機器學習和大數據挖掘】,后台回復【抓包軟件】即可獲取下載地址