最近一直在使用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))