Python--天貓詳情頁爬蟲

淘寶天貓商品抓取

分類: pythonhtml

 數據來源  --TTyb   2017-11-11  858  1833

 

 

本文基於 360 瀏覽器查看源碼, python3.4 編碼 ,爬蟲基礎須要學習的請看 爬蟲教程python

淘寶天貓的網頁反爬蟲很嚴重,存在大量的 驗證碼 、 登錄提示 、 瀏覽限制 等等機制,可是畢竟一山還有一山高,機器永遠比不上人的聰明,因此我發現了一個抓取的方法。json

任何網頁存在反爬蟲都是很棘手的,例如淘寶的反爬蟲很嚴重。可是衆所周知,手機端的頁面每每比電腦端的頁面好抓取,因此我打開了淘寶的手機端網頁 https://m.taobao.com ,點擊上面的搜索框,網頁自動跳轉:api

此時 網址已經變化成:瀏覽器

https://s.m.taobao.com/h5?search-btn=&event_submit_do_new_search_auction=1&_input_charset=utf-8&topSearch=1&atype=b&searchfrom=1&action=home%3Aredirect_app_action&from=1 

F12 查看網址的表單,找到 Headers ,看到請求的 host 變成了 s.m.taobao.com ,請求攜帶的表單有:ruby

清除表單的信息,鼠標往下拉,看下翻頁的信息:cookie

能夠看到 get 的表單變成了:session

event_submit_do_new_search_auction:1 _input_charset:utf-8 topSearch:1 atype:b searchfrom:1 action:home:redirect_app_action from:1 sst:1 n:20 buying:buyitnow m:api4h5 abtest:17 wlsort:17 style:list closeModues:nav,selecthot,onesearch page:2 

很明顯的發現翻頁的表單爲 page ,數了一下每一頁是 20 個商品的信息。這樣就找到了翻頁的部分。繼續清除加載好的表單,搜索看一下:app

查看獲得請求頭是:學習

event_submit_do_new_search_auction:1 _input_charset:utf-8 topSearch:1 atype:b searchfrom:1 action:home:redirect_app_action from:1 sst:1 n:20 buying:buyitnow q:Iphone 

我搜索的是 Iphone ,基本確認 keyword 是 q 了,再搜索 Ipad 看一下,表單爲:

q:Ipad search:提交 tab:all 

每次請求的表單都不同,我把他們彙總在一塊兒是這樣子:

"event_submit_do_new_search_auction": "1", "search": "提交", "tab": "all", "_input_charset": "utf-8", "topSearch": "1", "atype": "b", "searchfrom": "1", "action": "home:redirect_app_action", "from": "1", "q": keyword, "sst": "1", "n": "20", "buying": "buyitnow", "m": "api4h5", "abtest": "30", "wlsort": "30", "style": "list", "closeModues": "nav,selecthot,onesearch", "page": page 

只要請求的 url 攜帶這些參數就能夠了。其中查看頭部知道:

Referer="http://s.m.taobao.com" Host="s.m.taobao.com" 

到這裏其實就能夠寫代碼了,可是發現表單中出現了一個 style:list ,敏感的嗅覺以爲這裏有貓膩,應該是展示的樣式,因此我點擊銷量優先,發現 style:list 沒變,可是增長了 sort:_sale ,這裏會排序,再點其餘發現以下信息:

綜合排序sort:"" 銷量優先sort:_sale 價格低到高sort:bid 價格高到低sort:_bid 信用排序sort:_ratesum 起始價格:start_price:價格 終止加個:end_price:價格 

既然這樣已經找到請求表單,那麼構造 python 爬蟲代碼,安裝必要的爬蟲庫 pip3 install requests ,首先抓取首頁保持爬蟲連接,這個是爲了使頭部自動增長 cookie :

headers = { "User-Agent": "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5" } session = requests.session() session.get("https://s.m.taobao.com/", headers=headers) 

根據抓取到的表單構造 getdata :

getData = { "event_submit_do_new_search_auction": "1", "search": "提交", "tab": "all", "_input_charset": "utf-8", "topSearch": "1", "atype": "b", "searchfrom": "1", "action": "home:redirect_app_action", "from": "1", "q": keyword, "sst": "1", "n": "20", "buying": "buyitnow", "m": "api4h5", "abtest": "30", "wlsort": "30", "style": "list", "closeModues": "nav,selecthot,onesearch", "page": page } 

url 前綴 preUrl = "http://s.m.taobao.com/search?" ,升級頭部使其攜帶 Referer 和 Host :

# 升級頭部 headers.update( dict(Referer="http://s.m.taobao.com", Host="s.m.taobao.com")) 

抓取網頁:

# 抓取網頁 aliUrl = session.get(url=preUrl, params=getData, headers=headers) 

輸入關鍵詞和頁數,打印抓取下來的東西,竟然發現是 json :

這樣就很知足了,解析這段 json :

dictInfo = json.loads(content.decode("utf-8", "ignore")) infoList = dictInfo["listItem"] 

因爲我抓取的是 1 頁,因此獲得 20 個商品的 infoList ,infoList 裏面的每一個元素都是一個字典,提取 dict 裏面的店鋪信息:

for dict in infoList: store = dict["nick"] print(store)
相關文章
相關標籤/搜索