Python--天貓詳情頁爬蟲


淘寶天貓商品抓取

分類: python

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

 

 

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

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

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

此時 網址已經變化成:

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 ,請求攜帶的表單有:

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

可以看到 get 的表單變成了:

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 個商品的信息。這樣就找到了翻頁的部分。繼續清除加載好的表單,搜索看一下:

查看得到請求頭是:

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM