网上流传着许多抓取知乎数据的代码,抓取它的数据有一个问题必定绕不过去,那就是模拟登陆,今天咱们就来聊聊知乎的模拟登陆。git
获取知乎内容的方法有两种,一种是使用request,想办法携带cookies等必要参数去请求数据,可是使用requests的话,不只要解析Cookies,还要获取XSRF,比较麻烦,因此我想到了selenium。github
我直接控制Chrome请求知乎,而后模拟输入用户名和密码,这样不也能够吗,嘿嘿web
接下来讲一下大致流程:浏览器
首先控制selenium模拟请求知乎登陆界面:https://www.zhihu.com/signup?next=%2F微信
可是默认为注册,因此须要控制鼠标来点击上边那个登陆按钮,就变成这样了。cookie
而后咱们在控制浏览器找到输入用户名、密码的这两个input标签,使用send_keys()来将用户名密码输入进去便可,部分代码以下:session
但就在我正要点击登陆按钮时问题出现了:验证码测试
通过测试,知乎的验证码分为两种,并且两种验证码所对应的代码是不同的:编码
第一种:4位英文数字组成的图片,用户输入对应的英文数字便可。spa
第二种:纯中文组成的图片,用户使用鼠标来点击图片中倒立的汉字进行验证。
可是我发现验证码也不是次次都出现的,并且若是验证码要出现,当用户输入完密码以后就能够看见了。
并且即便验证码没有在页面中显示出来,却并不表明没有验证码,验证码那一部分代码仍是存在的,只是在存放验证码图片的<img>标签那儿图片连接显示为null而已。
那么当一个用户在登陆知乎,输入完用户名、密码以后会遇到两大类、四小类(一共四种状况):
(一)无验证码:用户输入完用户名、密码以后没有看见验证码
(1):(英文数字验证码)代码部分中<img>的class为englishImg, src为null
(2):(纯中文验证码)代码部分中<img>的class为chineseImg, src为null
(二)有验证码:用户输入完用户名、密码以后会看见验证码
(1):(英文数字验证码)代码部分中<img>的class为englishImg, src为base64编码的图片路径
(2):(纯中文验证码)代码部分中<img>的class为chineseImg, src为base64编码的图片路径
既然分为两大类四小类,那咱们就挨个的处理,首先在输入用户名改密码密码后判断有没有验证码显示出来,若没有,则直接点击登陆按钮进行登陆;
这是我辨别验证码类型的部分代码:
如有验证码显示出来,则再进行细分,是中文点击验证码仍是英文数字输入验证码,辨别验证码类型后再分别进行处理。
首先说一下中文验证码:嘿嘿嘿,时间比较仓促,这个我就没有识别,我看别人都是将验证码保存至本地而后对每一个中文的位置进行大体定位,而后人工输入倒立的字的序号,而后计算出该字在图片中的位置,在操控鼠标进行模拟点击。
下面咱们说说英文数字验证码:这个主要有两种解决方案
第一种:人工打码。当验证码出现时,将通过base64编码的图片进行解码而后保存至本地,而后将图片展现出来进行人工识别,再在控制台中输入识别后的结果,最后李勇模拟浏览器将结果输入到登陆页面中进行登陆。
第二种:借助第三方打码平台自动打码,首先将验证码保存至本地,而后接入第三方打码平台的接口进行机器打码,最后将结果输入登陆界面。
在这里我详细说说第三方打码的过程:
我是用的是“云打码”平台的接口(而后无心间发发现了他们平台一个错别字,是登陆,不是登录),首先注册一个开发者帐号:
进去以后点击个人软件,新建一个本身的软件(名字随便填),而后会得到一个软件代码(id),通信密钥(key),这两个参数在调用接口时要用。
而后联系官网上的客服,以开发者的身份向他索要测试分(云打码平台是收费的,没有题分,没法识别验证码)
而后在官网上的开发文档中选择调用示例及最新DLL,点击PythonHTTP示例下载,下载接口Demo
而后将Demo中的必要参数改一改(如username、password、id、Key等)最后在记得的代码中调用一下便可。
在验证码所有处理完毕以后再进行模拟登陆就能够正常的访问知乎中的内容了,最终我获取了知乎首页的文章标题
ps: 下边这张图片中的代码是在模拟登陆以后将cookies持久化至本地,等下次调用时直接将cookies放到session中保持长链接进行请求,不须要再登陆
使用session.get()保持长链接从新请求时,必定要带上header
ps: 在一切处理好以后我在模拟点击登陆时又碰到了一个问题,切切都处理好了,在点击登陆按钮后并无进入登陆页面,而是显示 “Miss argument grant_type ” 查询资料说是浏览器版本问题,当我将Chrome从70降到60后问题就解决了。
ps: 本次代码我所有在个人github上: https://github.com/songsa1/Python_song (60版本的Chrome和对应的webdriver的百度云连接在项目的readme中)
想了解更多Python关于爬虫、数据分析的内容,欢迎你们关注个人微信公众号:悟道Python