8.3 探索拉勾网反爬虫机制
通过前面分析,我们已经知道拉勾网的反爬虫机制导致我们只能爬取到部分详情页数据。针对这个问题,首先可以尝试使用随机的等待时间,如将代码中的 time.sleep(2) 替换为 time.sleep(random.randint(3,7)),使用这种随机的等待时长,更容易让服务器认为是一个人而不是爬虫在访问它,毕竟有些服务器会通过访问频率来判断访问是否是爬虫。经过测试这种方法并没有效果,我们仍然仅能爬取少部分的详情页数据。
既然不是等待时长的问题,我们怀疑拉勾网是不是通过 headers 中某些字段反爬虫。可以复制一个 Chrome 浏览器中的完整 headers 添加到请求中。
headers = {'Accept':'text/html,application/xhtml+xml,application/xml; \ q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept - Encoding':'gzip, deflate', 'Accept - Language':'zh-CN, zh;q=0.9', 'Cache - Control':'max-age=0', 'Connection':'keep - alive', 'Host': 'm.lagou.com', 'Upgrade-Insecure-Requests': '1', 'Referer':'http://m.lagou.com/', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) \ AppleWebKit/537.36 (KHTML,like Gecko)\ Chrome/62.0.3202.89 Safari/537.36'}
再次测试,结果仍没有改变。
这个时候再次考虑拉勾网的反爬虫机制,还有两个方向值得验证和考虑 - 通过 IP 地址或 Cookies 反爬虫。我们的爬取速度明显很慢,不可能触发拉勾网对 IP 地址的反爬虫机制,那结果很可能是拉勾网在通过 Cookies 实现其反爬虫检测。为了验证这一点,先通过 Chrome 浏览器的“检查”功能看一下访问拉勾网时所携带的 Cookies 是什么样的,如图 8-10 所示。
图 8-10 拉勾网请求 Cookies
可以看到 Cookies 中包含类似 user_trace_token、JSESSIONID、LGRID 等字段,应该高度怀疑拉勾网可能是在初次访问时设置了我们的 Cookies,然后通过后续检测 Cookies 是否满足其设置来判断是真正的浏览器还是爬虫在访问。
一般情况下,这种网站是在第一次访问它时设置了用户的浏览器 Cookies。可以将浏览器的浏览记录清空,然后打开 Chrome 浏览器的“检查”功能并访问一个招聘详情页,这时可以在 Network 的第一次请求返回的请求头部中看到图 8-11 所示的内容。
图 8-11 第一次请求返回的请求头部
图 8-11 中很明显有两条 Set-Cookie 的内容,正是这个设置了浏览器的 Cookies。
至此,我们终于明白了拉勾网的反爬虫机制。为了应对使用 Cookies 的反爬虫策略,只需要在 Requests 发起请求时添加一个设置好的 Cookies 即可。复制浏览器中的 Cookies 并使用 5.1 节中定义的 coo_regular 函数处理成字典形式。
cookies = { 'Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1520091611', 'Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1520068940', 'JSESSIONID': 'ABAAABAAAFDABFGF2AF5A4E7D491ACE7122117BA6834870', 'LGRID': '20180303234011-28a03f14-1ef9-11e8-b124-5254005c3644', 'LGSID': '20180303221109-b8af9788-1eec-11e8-b123-5254005c3644', 'LGUID': '20180131180750-97ff8f94-066e-11e8-a33c-525400f775ce', 'X_HTTP_TOKEN': '735ad785e81a37f88092f59765fd4fff', '_ga': 'GA1.2.608426115.1517393272', '_gat': '1', '_gid': 'GA1.2.207966809.1520068940', 'user_trace_token': '20180131180750-97ff88f9-066e-11e8-a33c-525400f775ce'}
然后在发起请求时增加这个 Cookies。
response = requests.get(com_url, headers=headers, cookies=cookies)
这样改动后,经过测试,爬虫可以正常爬取全部数据了。这种处理方式也不是很完美,虽然可以爬取全部数据,但是 Cookies 会过期,这就要求每隔一段时间,需要重新获取最新的 Cookies。一种可行的解决方案是,使用 Selenium 驱动 headless Chrome 浏览器打开一次拉勾网,然后使用 webdrive 的 get_cookies 方法获取 Cookies 数据,从中提取出 JSESSIONID、user_trace_token、LGRID、LGSID、LGUID 等重要数据,最后构造一个可用的 Cookies,交给 Requests 使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论