1、需要用代理
搞個代理ip池動態切換,預防被反爬蟲機制斃掉ip
獲取代理ip的方式很多,我主要通過爬
http://www.xicidaili.com/nn/網站,抓取ip后一個個檢查是否有效,然后記錄在本地文本,使用時讀取文本這種方法方法有點笨,不過寫起來簡單
注意天貓要用HTTPS代理,不是HTTP代理
2、需要使用cookie
最簡單的辦法就是手工登錄,登錄時抓包,復制黏貼cookie出來放到代碼里,但這種cookie有使用限制
最有效的辦法就是用selenium模擬人工登錄,然后抓包,復制黏貼cookie
還有種有效辦法是用typescript的mocha框架寫一套前端訪問腳本,抓取cookie存到本地
抓到的cookie是字符串形式的,要切換成字典形式
3、拼接搜索關鍵詞
搜索關鍵詞要轉換成gb2312格式,然后再進行urlencode編碼
用python來舉例
# 拼接檢索關鍵詞 def make_search_words(): words = ['奶粉', '嬰兒'] results = [] for word in words: word = word.decode('utf8').encode('gb2312') results.append(urllib2.quote(word)) return '+'.join(results)
4、拼接URL
如代碼所示,q是關鍵詞,sort是搜索方式,比如按銷量就是d,s是展示的商品數目
第一頁s是0,每頁60件,所以每頁往上遞增60
url = 'https://list.tmall.com/search_product.htm?q={}&sort={}&s={}'.format(make_search_words(), 'd', product_num) print url r = requests.get(url, headers=headers, verify=False, cookies=cookie, proxies=proxies) if '親,小二正忙,滑動一下馬上回來' in r.text.encode('utf8'): print '執行失敗,請檢查代理或cookie' sys.exit(1) with open(save_file, 'w') as f: f.write(r.text.encode('utf8'))
請求輸入過多被反爬,或者cookie錯誤被屏蔽時會出現“親,小二正忙,滑動一下馬上回來”,所以用它來檢驗是否爬到了正確的頁面
5、解析數據
以前我習慣用bs4,聽說lxml是效率最高的,就用lxml吧
from lxml import etree with open(save_file, 'r') as f: text = f.readlines() text = ''.join(text).decode('utf8') html_obj = etree.HTML(text) product_names = deque([]) for a in html_obj.xpath("//a[@target='_blank']"):
6、保存數據到sqllite數據庫或mysql數據庫
不展示全部代碼了,只提供思路,歡迎探討