这是工作中遇到的网站,算是自己遇到的一个新的类型.
需要动态获取并传递cookie.
脚本中使用了selenium+phantomJs
- 最开始发现所有菜单中的数据都在同一个页面中,并且有效数据均有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数据了