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数据库
不展示全部代码了,只提供思路,欢迎探讨