此项功能主要针对那些需要携带某些固定cookies(比如用户信息)去访问新的url,同时那个新的url又会给用户设置新的cookie的情形。
针对学校每天催着填写的晨午检(真的心酸),它其实是一个微信小程序。
作为一名合格的爬虫er,应该想着能不能让程序自动帮我们填写并发送(有些不好,,但是省事)。
最后找到了:
它是一个POST请求,请求的data是固定的(包含填写的一些位置参数等等,没必要改这个)
重点:该POST是通过cookies确定用户身份,但是这个cookies会在我们每次登陆后发生变化
经过较长时间的观察测试后我发现,它的cookies的前两段就可以唯一确定用户信息(同时对同一个用户这两段是一直不变的),只有第三段会在每次进入页面时刷新。
然后我就尝试去找第三段cookie是在什么时候设置的,
我发现这三个url 请求时都会设置第三个字段的cookie,同时它们会在请求头中加上前两段的决定用户的cookie。
知道了上面的情况后就可以开始编写代码了,由于用户cookie固定,直接写死就好了(多个用户的话可以放到列表里。至于这两个cookie怎么来的,我猜想肯定是通过微信APP的登陆设置的,有兴趣的可以去尝试模拟,但是难度肯定特别大,微信qq这样的“大牌”在登陆参数里肯定设置了很多加密项,这得有一定程度的JavaScript水平后才能尝试去逆向,我没有试过微信登陆,不知道它的难度如何。)
总之,我们使用前两段的cookie去请求生成第三段cookie的url:最后的time是个13位时间戳。
出现了以上这种情况,我们就需要手动给session对象添加cookies
代码:
session = requests.session()
c = requests.cookies.RequestsCookieJar()
c.set('cookie名', 'cookie值', path='/', domain='xxcapp.xidian.edu.cn')
c.set('cookie名', 'cookie值', path='/', domain='xxcapp.xidian.edu.cn')
session.cookies.update(c)
好了,添加完毕后用带着这些cookie的session去请求url,发现返回给我们的请求cookies已经带上了url给我们设置的:至此,成功实现。