【phantomJs + selenium】动态cookie,数据采集记录

这是工作中遇到的网站,算是自己遇到的一个新的类型.

需要动态获取并传递cookie. 

脚本中使用了selenium+phantomJs

  1. 最开始发现所有菜单中的数据都在同一个页面中,并且有效数据均有id特定包裹。并且,一个页面中涵盖了所有menu里面的模块,使用display切换。十分的友好....

  

  

        2.以id写完数据分析之后,入库测试。全为空值,再看network发现是该网站是用post请求返回的json数据。(这告诉我们以后要看准了在写啊, 很讨厌自己这个习惯.真的)

  3.目前看来,是在切换标签的时候,发送不同的post请求,获取json串。所以拿到json就很棒棒啦。

  4.构造了post请求,过程不赘述....因为..拿到的全是空值,它是假的=-=,最开始查看的例子是本来就没有这几个消息的所以没有过多的注意。

  5.最后盯紧了基本信息的post请求,发现所有的数据都在里面......其url=......./jbxx/qy/3702022814467?0.6979724272361008

  6.最后的字符串是类似id一样的东西,在页面中可以获取得到

  

  7.?后面get的参数..阅读源码发现是随机数

  

  本来想绕过,直接执行rendergtaic()函数,但是aicinfo是个全局变量,所以只有好好的构造数据包啦  

  利用js生成随机数构造url,尝试无果,返回307错误。

  再尝试,构造请求头,利用request库以及urllib2尝试抓取,均失败。

  再尝试phantomjs添加header,失败

  8.再抓取页面时....抓到了不一样的东西

  

  最开始找不出原因,控制台里跑了一下

  

    原来在这里设置了cookie然后再跳转到正常页面..

  那这个网站的验证机制就是,先赋值cookie,在访问详细页面的时候验证cookie,然后根据id和seesion发送post请求去请求数据(事后看起来真的是....我当时是怎么花了那么久搞不出来的??)

  第一次请求代码:

  while True:
            try:
                res = c.phJs_get(url)#phantomJs带头发送请求,返回值res={'text':html,'cookie':cookies}
            except Exception, e:
                res = None
                self.log.error('html请求失败..重试中....')
            if res is not None:
                try:
                    html = BeautifulSoup(res['text'], 'html.parser')
                except Exception, e:
                    html = None
                    self.log.error('html解析失败...')
                try:
                    self.pripid = html.find('input', id='pripid')['value']
                except Exception, e:
                    self.pripid = None
                if self.pripid is not None:
                    break

  获取数据的代码:  

 1  if self.pripid:
 2             url = self.rootUrl + '/pub/jbxx/qy/' + str(self.pripid) +'?' + str(rand)
 3             header = {
 4             'Accept':'application/json, text/javascript, */*; q=0.01',
 5             'Accept-Language':'zh-CN,zh;q=0.8',
 6             'Cookie':'UM_distinctid=15caef7925036-0bab5a718fff1d-323f5c0f-1fa400-15caef79251840; SESSION='+self.seesion + '; Hm_lvt_cdb4bc83287f8c1282df45ed61c4eac9=1497837663,1497850390,1497850402; Hm_lpvt_cdb4bc83287f8c1282df45ed61c4eac9=1497851908; AD_VALUE='+self.AD_VALUE,
 7             'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
 8             'X-CSRF-TOKEN':self.x_csrf_token,
 9             'X-Requested-With':'XMLHttpRequest',
10             }
11 
12             res = c.HTTP_POST(url,{},HEADERS=header)
13             self.log.info(json.loads(res))

  就能拿到json数据了

原文地址:https://www.cnblogs.com/Hed-geh0g/p/7052907.html