拉勾cookie解析

最近在爬拉勾,遇到一些问题,给后来的小伙伴总结一些经验。这里我们只谈技术,不谈代码。如果不是为了学习经验的话,还请移步百度。

首先说一下拉勾的反爬:IP频率限制,头信息限制,cookie时时验证。

  • IP频率限制:这是最常用,也是最有效的反爬机制之一,并没有测试拉勾的爬取阈值是多少。有兴趣的可以自己去测一下。
  • 头信息限制:拉勾对头信息的要求很高,如果你的头信息不全,会得到302或者无法访问的情况,如果你的头信息多了,有可能会给你投毒。这也很好解决,针对每个类型的URL定制headers
  • cookie时时验证:这是拉勾做的最好的反爬机制了,这里的时时可不是指每小时验证一次cookie,而是每个请求验证一次cookie。有人说这很正常啊,难道其他网站不是每条请求都验证吗?拉勾做的不同的地方在于,登录之后的cookie在访问一个新的URL之后是变化的,也就是说你从网页复制的cookie在爬虫中只能使用一次就会失效。而游客cookie则是每请求5个URL就会强制302。

cookie本质上是一些键值对的集合,可以粗略的看成字典,而拉勾每次请求的cookie变化的主要有三个参数,

  • LGRID:值为20190426111643-b773c320-67d1-11e9-b7c1-525400f775ce,前面的很容易看出是时间,后面的依我看应该是随机生成的UUID(不知道的请百度)
  • Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6:值是一个时间戳,和上一个参数的时间差只有几秒,或者完全相同,这个键前面是固定的,后面应该是某个的哈希值。
  • _gat:要么不存在,要么值为1

经过很多值对比和百度,发现变化的时间为上一次访问的时间,_gat暂时还不知道有什么作用,先不理他。那么找到cookie值的不同有什么用呢?难道还能找到他们的规律不成。当然不是,这些有的是随机生成的值,肯定没有规律的。上面的这些话只是在说明拉勾的cookie是一直变化的,所以直接复制cookie使用是不可行的。

这里先记录一下我遇到的两个小问题,后面再说怎么解决拉勾cookie:

1、 requests的session是不能维持你直接从浏览器复制然后加入到headers的cookie的,也就是说,你第一次访问的时候是携带cookie的,但你在使用session的时候,session还是没有cookie。解决方法:将字符串的cookie转化为字典,再转化为cookiejar对象传给session。
具体代码见:
https://blog.csdn.net/a583179/article/details/78904645
https://blog.csdn.net/falseen/article/details/46962011

2、在使用requests的时候出现:UnicodeEncodeError: ‘latin-1’ codec can’t encode character ‘\uff08’ in position 21: ordinal not in range(256)
原因:请求头中含有特殊字符,无法被编码为’latin-1’。我的程序出错是因为referer参数的URL是我自己构建的,包含中文或一些其他字符。
解决方法:使用urllib.request.quote(URL)转码一下就行。另外,我百度的时候,出现这种错误的大多是连接数据库时的错误。所以还是要看你的情况。

既然每次访问之后的cookie是变化的,那么浏览器是怎么得到这种变化的呢?浏览器能得到内容说明他时时更新了cookie。最先想到的肯定是每次请求的响应头里可能携带Set-Cookie参数对cookie做了修改。但是并没有,就算有的请求的响应头里确实有Set-Cookie,但也不是修改我上面说的两个关于上一次访问时间的值。

目前还没有琢磨透,待续。有思路的大佬还请指个明路。

猜你喜欢

转载自blog.csdn.net/Qwertyuiop2016/article/details/89540766