网上流传着许多抓取知乎数据的代码,抓取它的数据有一个问题一定绕不过去,那就是模拟登录,今天我们就来聊聊知乎的模拟登录。

获取知乎内容的方法有两种,一种是使用request,想办法携带cookies等必要参数去请求数据,但是使用requests的话,不仅要解析Cookies,还要获取XSRF,比较麻烦,所以我想到了selenium。

我直接控制Chrome请求知乎,然后模拟输入用户名和密码,这样不也可以吗,嘿嘿

接下来说一下大体流程:

  首先控制selenium模拟请求知乎登录界面:https://www.zhihu.com/signup?next=%2F

  

  但是默认为注册,所以需要控制鼠标来点击上边那个登录按钮,就变成这样了。

  

  然后我们在控制浏览器找到输入用户名、密码的这两个input标签,使用send_keys()来将用户名密码输入进去即可,部分代码如下:

  

  但就在我正要点击登录按钮时问题出现了:验证码

  经过测试,知乎的验证码分为两种,而且两种验证码所对应的代码是不一样的:

    第一种:4位英文数字组成的图片,用户输入对应的英文数字即可。

    第二种:纯中文组成的图片,用户使用鼠标来点击图片中倒立的汉字进行验证。

  但是我发现验证码也不是次次都出现的,而且如果验证码要出现,当用户输入完密码之后就可以看见了。

  而且即使验证码没有在页面中显示出来,却并不代表没有验证码,验证码那一部分代码还是存在的,只是在存放验证码图片的<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

  

使用selenium模拟登录知乎的更多相关文章

  1. 验证码破解 | Selenium模拟登录知乎

      import requests import re import execjs import time import hmac from hashlib import sha1 class Zhi ...

  2. 2020.10.20 利用POST请求模拟登录知乎

    前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...

  3. Python爬虫初学(三)—— 模拟登录知乎

    模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...

  4. requests_模拟登录知乎

    如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsr ...

  5. 利用scrapy模拟登录知乎

    闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...

  6. 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)

    代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...

  7. 3 使用selenium模拟登录csdn

    之前通过F12开发者模式调试,获取网站后台服务器验证用户名和密码的URL之后,再构造post数据的方式会存在一个问题,就是对目标网站的验证机制不明确,构造post数据除了用户名和密码之外,还可能有更复 ...

  8. 【爬虫】python requests模拟登录知乎

    需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题? 前期准备: 环境:ubuntu,python2. ...

  9. 使用Python+Selenium模拟登录QQ空间

    使用Python+Selenium模拟登录QQ空间爬QQ空间之类的页面时大多需要进行登录,研究QQ登录规则的话,得分析大量Javascript的加密解密,这绝对能掉好几斤头发.而现在有了seleniu ...

随机推荐

  1. 修改默认 JVM 参数 securerandom.source

    最近在云服务器上部署tomcat的时候,执行 startup.sh老是卡住了. 开始以为是日志配的不对,因为在对象中引入的是slf4,不是apache的log4j,后面把所有引入的地方都修改为Apac ...

  2. maven课程 项目管理利器-maven 1-2maven介绍和环境搭建

    maven简介: Maven是基于项目对象模型(POM),通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具. 1.1 Maven安装文件夹的结构 bin 目录放置包含mvn的运行脚本 ...

  3. Chrome浏览器正常,IE下界面却乱了

    背景:项目实战中总会遇到一些小问题,IE特别多 Chrome浏览器页面正常,IE下界面就乱了 原因分析 1.首先想到的是代码有米有问题呢?主要指的是兼容性 2.兼容性没有问题,那我们打开IE的开发工具 ...

  4. 从今天开始学习Swift--关于Swift (转)

    WWDC2014推出了新的编程语言,大家都站在了新的起跑线上,希望转发的本文能对园内的朋友一点介绍和帮助,如果大家对swift感兴趣,欢迎踊跃利用google. 原文地址:http://www.coc ...

  5. AngularJS 指令解析(二)

    AngularJS 指令解析(二) 第一篇我们讲过了作用域(scope)这块内容,现在我们进入正题,讲AngularJS的指令. 什么是指令? 这里我们引用官方的一句话: Custom directi ...

  6. rem与em的区别

    这两个单位都是相对元素 rem相对根元素 em相对于父级元素

  7. iDempiere 使用指南 采购开票付款流程

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  8. 一步步理解typedef

    1.如何用C语言实现一个函数,传递两个整形数,返回两个数的和? #include<stdio.h> int add(int a,int b) { return a+b; } void ma ...

  9. Mac 下显示隐藏文件或文件夹

    Mac 操作系统 隐藏显示文件 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:defaults write co ...

  10. Servlet是线程安全的吗?

    Servlet不是线程安全的. 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP请求时 ...