Python最新模拟登录知乎

大家都知道知乎是比较专业的知识问答平台。里面不仅具有专业的问答,还有社交属性,吸引了一大部分人使用Python来爬取答案,社交关系等。今天我们来进行爬虫操作的第一步:模拟登陆

分析Post数据

首先打开知乎登陆页,打开谷歌浏览器开发者工具,选择Network页,勾选Presev log,点击登陆。

我们可以在很容易的看到登陆接口如下:

模拟登陆最终是要构建请求头和提交参数,即:构造POST Headers和FormData

构造Headers

我们可以看到 Request Headers 信息,对比Request Headers和Response Headers,有几个参数比较关键authorization 和 X-Xsrftoken ,这两个是必须字段,其中 authorization 为验证身份,为固定值,可直接复制.

X-Xsrftoken,则是防止Xsrf跨域的Token认证,可以在Response Set-Cookie中找到.

所以需要请求一次登录页面,然后将这几个字段用正则表达式匹配出来。

构建From-Data

我们可以在控制台中看到,form提交了很多信息,中间的------WebXXXX---------起到分割作用,可以忽略。

timestamp 为时间戳,可以使用 timestamp = str(int(time.time()*1000))生成

signature 通过 Crtl+Alt+F 搜索找到是在一个 JS 里生成的,是通过 Hmac 算法对几个固定值和时间戳进行加密,那么只需要在 Python 里也模拟一次这个加密即可。

captcha验证码,是通过 GET 请求单独的 API 接口返回是否需要验证码(每次登陆必须请求一次),如果是 True 则需要再次 PUT 请求获取图片的 base64 编码。

实际上有两个 API,一个是识别倒立汉字,一个是常见的英文验证码,任选其一即可,代码中我将两个都实现了,汉字是通过 plt 点击坐标,然后转为 JSON 格式。(另外,这里其实可以通过重新请求登录页面避开验证码,如果你需要自动登录的话可以改造试试) 最后还有一点要注意,如果有验证码,需要将验证码的参数先 POST 到验证码 API,再随其他参数一起 POST 到登录 API。

保存 Cookies

最后实现一个检查登录状态的方法,如果访问登录页面出现跳转,说明已经登录成功,这时将 Cookies 保存起来(这里 session.cookies 初始化为 LWPCookieJar 对象,所以有 save 方法),这样下次登录可以直接读取 Cookies 文件。

运行环境

Python 2/3requestsmatplotlibPillow

完整代码

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180522G09IXM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券