这里是我们要抓取的数据:
打开chrome的调试工具发现数据是通过一个Ajax请求来获取的:
这样的话,获取数据就太简单了,因为完全不需要去解析html页面,只需要将返回的json串解析即可得到数据
class subwayquery: url='http://subway.simba.taobao.com/report/getNetworkPerspective.htm' def __init__(self,token,cookiestr): self.data= { 'sla':'json', 'isAjaxRequest':'true', 'token':token, '_referer':'/tools/insight/queryresult?tab=tabs-region&start=&end=&kws=', } self.token=token self.postdata=urllib.parse.urlencode(self.data).encode('utf-8') self.startDate=(datetime.datetime.now()-datetime.timedelta(days=8)).strftime('%Y-%m-%d') self.endDate=(datetime.datetime.now()-datetime.timedelta(days=1)).strftime('%Y-%m-%d') self.headers= { 'Host':'subway.simba.taobao.com', 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0', 'Accept':'application/json, text/javascript, */*; q=0.01', 'Accept-Language':'zh-CN,zh;q=0.8', 'Connection' : 'Keep-Alive', 'Cookie' : cookiestr, 'Origin':'http://subway.simba.taobao.com', 'Cache-Control':'max-age=0', 'X-Requested-With':'XMLHttpRequest' } self.http=urllib3.PoolManager(headers=self.headers,timeout=15,retries=15) def query(self,keyword,perspectiveType): tourl=self.url+'?bidwordstr='+urllib.parse.quote(keyword)+'&startDate='+self.startDate+'&endDate='+self.endDate+'&perspectiveType='+perspectiveType data= { 'sla':'json', 'isAjaxRequest':'true', 'token':self.token, '_referer':'/tools/insight/queryresult?kws='+urllib.parse.quote(keyword)+'&tab=tabs-region&start=&end=', } try: #10次重试保证返回值 i=0; while(True): response=self.http.request_encode_body('POST',tourl,fields=data) parse=json.loads(response.data.decode()) if(parse['code']=='200'): if(parse['result']): return parse else: i+=1 if(i==10): # print(keyword) return False else: return False return False except Exception as e: print(e) return False
这里使用了urllib3的http连接池,可以方便地设置超时重连和重试次数。不知道为什么,经常会得到空的数据,返回json串的result中没有内容,所以这里设置了10次重试,基本可以保证不会得到空的值。
Python实现的淘宝直通车数据抓取(1)
Python实现的淘宝直通车数据抓取(2)
Python实现的淘宝直通车数据抓取(3)
Python实现的淘宝直通车数据抓取(4)