python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码

目前知乎使用了点击图中倒立文字的验证码:

 

用户需要点击图中倒立的文字才能登录。

这个给爬虫带来了一定难度,但并非无法解决,经过一天的耐心查询,终于可以人工识别验证码并达到登录成功状态,下文将和大家一一道来。



我们学习爬虫首先就要知道浏览器给服务器传输有什么字段(我用的是Safari浏览器进行演示,当然Chrome、Firefox都可以)

我们点击了第一个和第二个文字:

右键审查元素-->点击登录 后可以看到:

从右面可以得到:报文发送的URL是:https://www/zhihu/com/login/phone_num

这不难理解,知乎的登录是把手机和邮箱区分开来,我们用的是手机登录,经过测试邮箱的URL是:https://www/zhihu/com/login/email,这里就不截图了。

把右面的资源往下拉:

除了phone_num是用户名,password是密码,我们还看到了几个重要信息:_xsrf、captcha、captcha_type

那么重点来了,这都分别是什么意思呢?经过反复查询,直接把简介明了的解释给大家:

_xsrf:是“跨站请求伪造”(CSRF / XSRF)(Cross Site Request Forgery),这是知乎的一个安全协议,当你第一次访问知乎主页www.zhihu.com的时候,知乎会自动往你的浏览器发送一个_xsrf字段并且和你的主机绑定,之后的你每次访问知乎服务器时,你的浏览器都会带上这个字段,知乎发现你发送的_xsrf是我给你的_xsrf时才能有权访问,如果_xsrf错误或者不填都无法访问。顺便一提,这是一个安全机制,基本所有的网站都会设置一个 XSRF/CSRF 的字段,防止黑客攻击。

我们既然知道浏览器每次向知乎发送请求时都会带上_xsrf字段,那么我们的爬虫就必须要模拟浏览器访问知乎首页获取这个 _xsrf 字段并在登录时提交这个字段,才能登录成功。

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]。

captcha_type:这个字段就有意思了,其中有一个小技巧来切换成数字英文验证码。如果把它设置成 "cn" 就是倒立文字验证码,设置成 "en" 就是数字英文验证码,我没就这里设置成"cn",数字英文验证码网上很多,大家可自行寻找。(经测试不填这个字段也是数字英文验证码)

到这里思路就很清晰了,我们知道了这三个重要信息,就知道如何让爬虫登录知乎了,不多说直接上代码:

import requests
try:
    import cookielib
except:
    import http.cookiejar as cookielib

import re
import time

def get_xsrf():
    # 获取xsrf code
    response = requests.get(‘https://www.zhihu.com‘, headers=header)
    # print(response.text)
    match_obj = re.match(‘[\s\S]*name="_xsrf" value="(.*?)"‘, response.text)
    if match_obj:
        return match_obj.group(1)
    return ‘‘

def get_captcha():
    # 验证码URL是按照时间戳的方式命名的
    captcha_url = ‘https://www.zhihu.cdom/captcha.gif?r=%d&type=login&lang=cn‘ % (int(time.time() * 1000))
    response = session.get(captcha_url, headers=header)
    # 保存验证码到当前目录
    with open(‘captcha.gif‘, ‘wb‘) as f:
        f.write(response.content)
        f.close()

    # 自动打开刚获取的验证码
    from PIL import Image
    try:
        img = Image.open(‘captcha.gif‘)
        img.show()
        img.close()
    except:
        pass

    points = [[22.796875, 22], [42.796875, 22], [63.796875, 21], [84.796875, 20], [107.796875, 20], [129.796875, 22], [150.796875, 22]]
    seq = input(‘请输入倒立字的位置\n>‘)
    s = ‘‘
    for i in seq:
        s += str(points[int(i)-1]) + ‘,‘
    return ‘{"img_size":[200,44],"input_points":[%s]}‘ % s[:-1]

def zhihu_login(account, password):
    # 知乎登录
    if re.match(‘1\d{10}‘, account):
        print(‘手机号码登录‘)
        post_url = ‘https://www.zhihu.com/login/phone_num‘
        post_data = {
            ‘captcha_type‘: ‘cn‘,
            ‘_xsrf‘: get_xsrf(),
            ‘phone_num‘: account,
            ‘password‘: password,
            ‘captcha‘: get_captcha(),
        }

        response_text = session.post(post_url, data=post_data, headers=header)
        session.cookies.save()

if __name__ == ‘__main__‘:
    agent = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8‘
    header = {
        ‘HOST‘: ‘www.zhihu.com‘,
        ‘Referer‘: ‘https://www.zhihu.com‘,
        ‘User-agent‘: agent,
    }
    session = requests.session()
    zhihu_login(‘输入登录的手机号‘, ‘输入登录的密码‘)

想必大家看代码都能看的懂了,我再简单说一嘴重要的

非常要注意的地方是:必须要用session来请求验证码再用session来提交报文,为什么不能用requests呢?一个session就是一个会话,如果用一个session访问了一个网站,后面再拿着这个session再请求这个网站,它会把网站带给我们的cookie或者说网站放到字段里面的session完全的给带回去,这里面的cookie就非常重要,在我们访问知乎的时候,不管我们有没有登录,服务器都可以往我们的header里面放一些值,我们用pycharm的debug来看一下session:

可以看到里面有很多cookie,获取验证码时服务器给我们发的这些cookie,必须在登录时再传给知乎服务器才算认证成功。如果在登录时用requests,它会再建立一次session,就无法把获取验证码带来的cookies传给服务器,这样固然认证失败。

好了,大功告成!只要输入第几个文字是倒立的就行了,比如第二个和第四个文字是倒立的,输入:24  按回车后就自动添加坐标,是不是很开心!

时间: 2024-10-21 01:13:39

python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码的相关文章

python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

操作环境:python3 在上一文中python爬虫scrapy框架--人工识别登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前的文章便于理解 本文将介绍如何用scrapy来登录知乎. 不多说,直接上代码: import scrapy import re import json class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhi

Python爬虫Scrapy框架入门(0)

想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题以及解决方案吧. 给几个链接吧,我是根据这几个东西来尝试学习的: scrapy中文文档(0.24版,我学习的时候scrapy已经1.1了,也许有些过时): http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html 大神的博客介绍:

Python爬虫——Scrapy框架安装

在编写python爬虫时,我们用requests和Selenium等库便可完成大多数的需求,但当数据量过大或者对爬取速度有一定要求时,使用框架来编写的优势也就得以体现.在框架帮助下,不仅程序架构会清晰许多,而且爬取效率也会增加,所以爬虫框架是编写爬虫的一种不错的选择. 对于python爬虫框架,目前较为热的是Scrapy,其是一个专门爬取web结构性数据的应用框架.Scrapy是一个强大的框架,所依赖的库也较多,比如有lxml,pyOpenSSL和Twisted等,这些库在不同的平台下要求也不一

数据之路 - Python爬虫 - Scrapy框架

一.Scrapy框架入门 1.Scrapy框架介绍 Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,其架构清晰,榄块之间的榈合程度低,可扩展性极强,可以灵活完成各种需求. Engine:引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Item:项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象. Scheduler:调度器,接受引擎发过来的请求并将其加入队列中, 在引擎再次请求的时候将请求提供给引擎. Downloader:下载

Python爬虫Scrapy框架入门(2)

本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写xpath表达式,获取信息.自动爬取策略是,找到翻页网页元素,获取新链接地址,执行翻页.网页分析部分不再赘述,原博讲的很好很清楚,很涨姿势 基于拿来主义,我们只需要知道怎么更改Scrapy框架就行了~ items.py: import scrapy class TestprojItem(scrapy

python爬虫Scrapy框架之中间件

Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spider的时候, 所以说下载中间件是结余Scrapy的request/response处理的钩子, 用于修改Scrapy request和response. 编写自己的下载器中间件 : 编写下载器中间件, 需要定义下一或者多个方法的python类 新建一个关于爬取httpbin.org网站的项目 scrapy startproject httpbintest cd

Python 爬虫-Scrapy框架基本使用

2017-08-01  22:39:50 一.Scrapy爬虫的基本命令 Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行. Scrapy命令行格式 Scrapy常用命令 采用命令行的原因 命令行(不是图形界面)更容易自动化,适合脚本控制本质上,Scrapy是给程序员用的,功能(而不是界面)更重要. 二.Scrapy爬虫的一个基本例子 演示HTML页面地址:http://python123.io/ws/demo.html 步骤一:建立一个Scrapy爬虫 选取一个文件夹,

python爬虫--scrapy框架

Scrapy 一 介绍 Scrapy简介 1.Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛 2.框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便 Scrapy架构图 Scrapy主要包括了以下组件: 1.引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) 2.调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可

python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' 一丶scrapy的图片数据爬取(流数据的爬取) ? scrapy中封装好了一个管道类(ImagesPipeline),基于该管道类可以实现图片资源的请求和持久化存储 编码流程: 爬虫文件中解析出图片的地址 将