首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scrapy爬虫教程三 详细的Python Scrapy模拟登录知乎

之前爬取携程和51job都是免登陆就能爬取数据的,但是今天爬取知乎的时候就需要登录后才能爬到数据,那我们只能进行模拟登录了。

知乎登录分为邮箱登录和手机登录两种方式,通过浏览器的开发者工具查看,我们通过不同方式登录时,网址是不一样的。邮箱登录的地址email_url = 'https://www.zhihu.com/login/email',手机登录网址是phone_url = 'http://www.zhihu.com/login/phone_num'。

分析知乎API

我们先进入知乎的登录页面,输入用户名和密码(为了查看登录时请求的api信息,我这里故意把密码输错),点击登录,查看右边Network信息。

知乎登录页

通过Network截取到使用phone_num登录,所以请求api为http://www.zhihu.com/login/phone_num,POST请求需要的From Data为_xsrf、password、captcha_type和phone_num,其中captcha_type为cn或者en(这里预示着有两种方式进行验证码验证,下面会详细解答的),_xsrf是从上一页面动态获取的(这个值的获取在下面也有解答),phone_num和password为登录手机号和密码。

通过对知乎登录需要提交的From Data信息进行分析得知只有_xsrf这个参数的值是需要动态获取,并且是从上一个页面(https://www.zhihu.com/#signin)进行获取过来的,如果在登录时没有_xsrf值时登录请求会返回校验失败。

如何获取_xsrf?见下图,请求zhihu.com时查看Response信息,从页面中找出_xsrf值存储的位置。

万事俱备,只差代码啦,下面附上我的代码,差点忘记上边还预留的问题了,那就是From Data中captcha_type对应的是cn和en两种情况,虽然在网页登陆知乎的时候你是看不到验证码的,但是在登录的时候一定要验证一下验证码(不知道为啥我试了好多次都没有在网页上显示出来填写验证码,可能是知乎反爬虫工程师的一个小套路吧,想了解反爬虫手段的请看:反爬虫手段 ),captcha_type如果把它设置成 "cn" 就是倒立文字验证码,设置成 "en" 就是数字英文验证码,下面我会把这两种方式的验证码都会演示一下的,下面真正的代码要来了,为了让你们真正的能练习一下,我就附上图片啦:

1.针对数字英文验证码的方式:

重点还需要关注一下代码中的cookie,这个cookie可以在PC端登录成功后,F12中就能找到这个cookie值,替换一下就可以。

2.针对倒立文字验证码

针对captcha这个参数需要说明一下,它的的"img_size"字段是固定的,每次都是[200,44],应该就是图片大小的意思。后面的"input_points"是你点击验证码中倒立文字的坐标,由于验证码中七个文字位置是固定的,我们只要每个字都点一下再进行登录,再审查元素来确定每个字的坐标就能模拟点击了(是不是豁然开朗),这个步骤自行点击来获取坐标,我把我测试好的七个文字坐标依次拿出来:[22.796875,22],[42.796875,22],[63.796875,21],[84.796875,20],[107.796875,20],[129.796875,22],[150.796875,22]。

最后再说明一下,当你通过其他的教程在模拟登录的时候会遇到验证码会话无效或者请点击图中倒立的文字又或者请输入验证码等字样的时候,使用上述的解决方案都是可以的,亲测有效,绝对有效。。。

简书相应的文章在更新。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券