Python实现的淘宝直通车数据抓取(2)

  再看我们要抓取的数据,网页是这样的:



  这里是我们要抓取的数据:



  打开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) 

猜你喜欢

转载自raphael10241024.iteye.com/blog/2285364