写爬虫遇到坑和总结

最近一直在使用scrapy编写各种爬虫,遇到一些坑,下面来总结一下,以免下次遇到又花费很多时间

(1)

我们在请求前拼接headers时,并不需要把所有request headers都拼接上,可以使用在线http请求,如http://coolaf.com/去测试比如下面refer只要截取前面就可以,后面参数可能是动态生成的,对每次请求都一一对应的,只能适用一次请求,所以一次要爬取很多页面就把它去掉
这里写图片描述

(2)

有时候我们请求,即使把所有参数带上返回还是空
这里写图片描述
这种情况可能被加密了,可以看到参数eleven的值是64位无规律字符串,这就是网站在前端用js加密的key
这里写图片描述
我们可以找到网站js解密方法

这里写图片描述
解密步骤:解密使用普通js方法,去掉方法头尾在页面Console跑一次,会返回js方法,然后又去掉该js方法头尾再跑一次,这次就返回我们需要的密码了

代码解决方法
跟爬虫类似,根据url请求返回我们需要的加密js代码,去掉方法头
这里写图片描述

 url = 'http://hotels.ctrip.com/international/Tool/cas-ocanball.aspx?callback=%s&_=%s' % (n, t)
                headers = {'User-Agent': random.choice(user_agent_list),
                           'Referer': 'http://hotels.ctrip.com/international/%s.html?isFull=F' % hotel_id,
                           'Host': 'hotels.ctrip.com',
                           'Accept-Language': 'zh-CN,zh;q=0.9',
                           'Accept-Encoding': 'gzip, deflate'}
                # content = requests.get(url, headers=headers, proxies={'http': proxy}).content
                content = requests.get(url, headers=headers).content
                content = content.replace('eval', '')
                key = self.ec.jiemi_2(content, n, headers["Refe````````````
er"])

从代码看出,拿到一次解密返回的js代码,也就是上面的content,再进行第二次解密

 def jiemi_2(cls, js, callback, local):
        eval_js = cls.execute_script('return ' + js)
        index = eval_js.index('new Function')
        result = re.findall('\+\s([a-zA-Z0-9_]+)\s+\+', eval_js[index:])[0]
        index = eval_js.index(callback)
        eval_js = eval_js[14: index]
        eval_js = eval_js.replace('window.location.href', '"%s"' % local)
        key = cls.execute_script(eval_js + '; return ' + result)
        return key

第二次就是返回我们想要的key了
最后我们在scpray中间件,去调用我们的解密方法,拿到eleven密码,然后拼接参数就可以爬取我们想要的数据了

 eleven = self.js.jiemi_1(id)
 url = request.meta.get('target_url')
 request._set_url(url + ('&eleven=%s' % eleven))

猜你喜欢

转载自blog.csdn.net/jyxmust/article/details/79972706
今日推荐