分類: pythonhtml
本文基於 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)