验证码识别,这是一个爬虫开发人员绕不开的痛

【愚公系列】《Python网络爬虫从入门到精通》047-验证码识别(第三方验证码识别) 在爬虫开发中,验证码是我们需要面对的一个挑战,尤其是当我们遇到更加复杂的验证码时,如何识别它们成为了一个难题。本篇文章,我们将讨论如何使用第三方验证码识别服务来突破这一障碍。相比传统的图像处理与OCR技术,第三方验证码识别服务提供了更为高效和精准的解决方案。通过调用这些服务,我们可以大大简化验证码识别的流程,提升爬虫的自动化程度。第三方验证码识别服务概述:了解市面上常见的第三方验证码识别服务及其优势。如何使用Python调用第三方验证码识别API:讲解如何接入这些服务,并进行验证码的自动识别。 阅读详情
点击上方 “AI派 ”, 选择“ 设为星标 ”
最新分享,第一时间送达!

640?wx_fmt=jpeg


Tango,目前就职在一家对日开发的的IT服务公司。 不是科班出身的我,出于对编程的热爱,自学了软件开发。 从此深深陷入在代码的世界而无法自拔。
编辑:王老湿

我们的专栏发布后,目前已经更新了 11 篇:

  1. 等了好久,Scrapy你可终于来了!


今天来来分享下关于爬虫开发中验证码识别的问题。先来说下验证码的事情, 验证码(CAPTCHA )的全称为 全自动区分计算机和人类的公开图灵测试 。 从其定义可以看出,验证码用于测试用户是否为真实人类。 很多网站在登录或者注册时都会出现一个被扭曲的图片,上面写着一些文本。这些其实就是一种验证码。可以看到,验证码的设计初衷是为了区分出人和机器,防止一些机器/爬虫浪费大量的服务器资源,进而导致正常用户访问受到影响。

但是对于我们做爬虫开发来说,验证码就是拦路虎了,而且现在验证码也在不断设计技术中,这对我们爬虫开发人员就是一个绕不开的痛了。所以这周我们将带着大家通过Python程序来自动识别这些验证码。不过 要做好心里准备,程序并不能百分之百的准确识别出来。

情景演示

当我们访问 http://example.python-scraping.com/user/register 这个网站时,你会看到如下的画面:

640?wx_fmt=png

红框中的内容就是验证码了。我们通过爬虫获取一下这个页面的内容

import requests
from lxml.html import fromstring

def parse_form(html):
    tree = fromstring(html)
    data = {}
    for e in tree.cssselect('form input'):
        if e.get('name'):
            data[e.get('name')] = e.get('value')
    return data

url = "http://example.python-scraping.com/user/register"
session = requests.session()
html = session.get(url)
form = parse_form(html.content) # 获取页面的表单
print(form)
640?wx_fmt=png

需要安装一个cssselect库。pip install cssselect

这些表单内容我们都很好处理,如果要处理验证码,我们首先需要将它加载出来。

在Python中处理图像我们通常使用Pillow包,安装方法:pip install Pillow

我们通过如下代码来返回Image对象。

from io import BytesIO
from PIL import Image
import base64

def get_img(html):
    tree = fromstring(html)
    img_data = tree.cssselect('div#recaptcha img')[0].get('src')
    img_data = img_data.partition(',')[-1]
    binary_img_data = base64.b64decode(img_data)
    img = Image.open(BytesIO(binary_img_data))
    return img

完整代码如下:

import requests
from lxml.html import fromstring

from io import BytesIO
from PIL import Image
import base64

def parse_form(html):
    tree = fromstring(html)
    data = {}
    for e in tree.cssselect('form input'):
        if e.get('name'):
            data[e.get('name')] = e.get('value')
    return data
def get_img(html):
    tree = fromstring(html)
    img_data = tree.cssselect('div#recaptcha img')[0].get('src')
    img_data = img_data.partition(',')[-1]
    binary_img_data = base64.b64decode(img_data)
    img = Image.open(BytesIO(binary_img_data))
    return img

url = "http://example.python-scraping.com/user/register"
session = requests.session()
html = session.get(url)
form = parse_form(html.content) # 获取页面的表单
img = get_img(html.content) # 获取图片信息
print(img)
640?wx_fmt=png

我们为了能从图片中识别出字符,接下来需要用到光学字符识别(OCR)技术。

Tesseract的使用

安装方法:pip install pytesseract

除了安装这个库之外,还需要在本地安装一个软件下载地址:https://github.com/tesseract-ocr/tesseract/wiki

根据自己的系统下载对应的版本,我这边以Windows系统为例。

这时运行基本会报错:

640?wx_fmt=png

我们还需要修改一下源码,就是红框中的py文件。

640?wx_fmt=png

我们把红框中的内容换成我们软件的安装路经,以下是我的安装路径:

640?wx_fmt=png
import pytesseract
str_info = pytesseract.image_to_string(img)
print(str_info)

通常我们如果直接去识别这个图片,很大可能会返回空字符串。这是因为这里面有背景噪音也就是干扰元素。

我们观察我们的验证码的文本颜色为黑色的,所以我们可以将图片中黑色部分分离出来,这个过程通常称为阈值化。

img.save('temp.png?raw=true')
new_img = img.convert('L') # 转化灰度图
new_img.save('temp2.png?raw=true')
bw = new_img.point(lambda x: 0 if x < 1 else 255,'1')
bw.save('temp3.png?raw=true')

运行后我们可以看到如下的图片,在我们脚本的同级目录下:

640?wx_fmt=png

这样我们处理后的图片噪音就少了很多,再通过我们的pytesseract库来进行识别,这样的成功率会比较高。

完整代码:

import requests
from lxml.html import fromstring

from io import BytesIO
from PIL import Image
import base64

import pytesseract

def parse_form(html):
    tree = fromstring(html)
    data = {}
    for e in tree.cssselect('form input'):
        if e.get('name'):
            data[e.get('name')] = e.get('value')
    return data
def get_img(html):
    tree = fromstring(html)
    img_data = tree.cssselect('div#recaptcha img')[0].get('src')
    img_data = img_data.partition(',')[-1]
    binary_img_data = base64.b64decode(img_data)
    img = Image.open(BytesIO(binary_img_data))
    return img

url = "http://example.python-scraping.com/user/register"
session = requests.session()
html = session.get(url)
form = parse_form(html.content) # 获取页面的表单
img = get_img(html.content)
print(img)
img.save('temp.png?raw=true')
new_img = img.convert('L') # 转化灰度图
new_img.save('temp2.png?raw=true')
bw = new_img.point(lambda x: 0 if x < 1 else 255,'1')
bw.save('temp3.png?raw=true')
str_info = pytesseract.image_to_string(bw)
print(str_info)

运行效果:

640?wx_fmt=png

我们可以看到图片上的内容被识别出来了。

问题

对于这样简单的验证码,即使成功率达不到100%也没关系,只要多请求几次还是可以成功的,但是要注意频率,要不然很容易被封IP。

除了这种简单的验证码之外,还有很多复杂的验证码,这时候我不建议大家花费太多精力在破解验证码上面。我们可以借助第三方工具或者打码平台甚至人工干预来绕过验证码。

好了,这期的内容就是这些,欢迎大家进学习群讨论。学习群加入方式:扫描下方的微信二维码,添加微信好友,之后统一邀请你加入学习群。添加好友时一定要备注:爬虫。 

640?wx_fmt=png

?长按识别,添加王老湿微信

(完)





640?wx_fmt=jpeg

?关注“Python与人工智能社区”


王老湿目前建立了Python、爬虫、数据分析、机器学习、AI实战、自然语言处理、计算机视觉、推荐系统等方向的读者交流群,大家可以添加王老湿的微信进行加群

640?wx_fmt=png
?长按识别,添加王老湿微信



近期专栏推荐 (点击下方标题即可跳转)


1. 

2. 

3. 

4. 

点下「在看」,给文章盖个戳吧!?

【愚公系列】《Python网络爬虫从入门到精通》046-验证码识别(字符验证码) 在之前的内容中,我们已经学习了如何使用Python进行各类网络爬虫的编写与优化。然而,在实际的爬虫项目中,我们经常会遇到验证码的挑战,它是阻止自动化程序访问的重要手段之一。本篇文章,我们将深入探讨验证码识别中的一种常见类型——字符验证码。验证码识别是爬虫自动化中的一项重要技能,掌握它将大大提升我们的爬虫项目的效率和成功率。验证码的基本原理:了解验证码的作用和常见类型。字符验证码识别的基本方法:从简单的图像处理到使用OCR(光学字符识别)技术。实战:使用Python和相关库进行字符验证码识别。 阅读详情

相关推荐

Python网络爬虫项目开发实战:如何解决验证码处理

在网络爬虫项目中,验证码是一种常见的反爬虫机制。当网站检测到频繁的请求或异常行为时,通常会要求用户输入验证码以验证其身份。对于自动化爬虫来说,处理验证码是一个挑战,但并非不可能。

一个好知识的传播者 1437

【爬虫】验证码处理方案

仅限于输入一次就可持续使用的情况使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理图片识别引擎:OCR(Optical Character Recognition)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。Tesseract:一款由HP实验室开发,由Google维护的开源OCR引擎,特点是开源,免费,支持多语言,多平台。 github项目地址:https://github.com/tesseract-oc

Interest drives progress 2515

Python爬虫之验证码识别

验证码是为了防止恶意程序或机器人对网站进行恶意攻击和刷数据的一种安全措施。验证码技术的原理是在网页上添加一些随机字符或图像,要求用户在登录或注册时输入以证明其身份。由于验证码一般由图像或音频生成,人机识别难度不同,所以验证码识别也成为了一个很重要的问题。 在Python爬取网页时,如果遇到验证码,可以采用OCR(Optical Character Recognition)技术识别字母和数字验证码,有时还需要使用图像处理技术对验证码图片进行处理以提高准确率。

naer_chongya的博客 5332

python爬虫解决极验验证码问题

使用2captcha的服务解决登录时的极验验证码 爬虫在抓网站数据时,不可避免要和验证码做长久斗争。当然能绕过最好,但是总有绕不过的验证码,此时,对于简单的可以尝试绕过,有难度的对接打码平台。现在验证码多种多样,点选,滑动,英文字母组合等。所以要爬取一些网站的数据也越来越麻烦。   本篇就针对简书的依次点击文字的验证码进行破解 1、简书的验证技术采用的是极验提供的。 2、...

sunon_的博客 1万+

【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)

在爬虫开发中,我们经常会遇到不同类型的验证码,其中滑动拼图验证码因其特殊的交互性和较高的安全性,成为了爬虫开发者面临的一大难题。本篇文章,我们将深入研究如何识别并绕过滑动拼图验证码。与传统的字符验证码或简单的图形验证码不同,滑动拼图验证码通常要求用户通过滑动某个图形块,使其与背景图片完全对接,这种验证码不仅考验了图像识别技术,还涉及到一定的图像处理和模拟鼠标操作技巧。滑动拼图验证码的基本原理:了解滑动拼图验证码如何工作,以及其识别的难点。图像处理与特征提取:如何从验证码的背景图和拼图块中提取有效特征。

愚公智库 10万+

认识网络爬虫(一看秒知)

指访问全互联网资源的网络爬虫。的网页,这样可以有效地减少网页的下载量,减少访问时间和存储空间的耗费,但是增加了。情热点,跟踪目标话题,并根据一定的标准采取相应的舆情控制与引导措施。放到自己的平台上展示,并提供横向数据的比较,帮助用户寻找实惠的商品价格。运用网络爬虫技术,不断地访问交通出行的官方售票网站刷新余票,一旦发现有新的余票便。力的数据支持,还能为中小型网站的推广引流提供有效的渠道,给我们的生活带来了极大的。即便如此,网络爬虫的抓取行为仍会给网站增加不小的压力,严重时甚至可能影响对网。

weixin_49816293的博客 2727

python、Tesseract的简易验证码的识别

因课程作业有字符识别相关题目,所以使用tesseract库试试效果 环境 Python3.6 Pycharm Opencv-python pillow Pytesseract Tesseract-OCR 环境配置可以参考: python、opencv的安装配置 pil、tesseract的安装配置 识别的二维码: 图像预处理: 1.验证码图片(滤波)灰度化 2.二值化(使用自适应阈值的方法) ...

wei 663

网络爬虫 - 9 自动识别验证码与初识Scrapy框架

自动识别验证码与初识Scrapy框架 1、多线程优化 2、登录古诗文 登录:直接发送post,然后发送get 登录:先发送get,获取一下信息,然后再发送post,然后发送get 登录:get、post、get、get。 访问登录后的页面 验证码,下载到本地,手动输入 3、自动识别验证码 (1)光学识别 tesseract 指令识别...

韩波的博客 1889

Python爬虫四种验证码的解决思路

1.输入式验证码 这种验证码主要是通过用户输入图片中的字母、数字、汉字等进行验证。如下图 图1 图2 解决思路:这种是最简单的一种,只要识别出里面的内容,然后填入到输入框中即可。这种识别技术叫OCR,这里我们推荐使用Python的第三方库,tesserocr。对于没有什么背影影响的验证码如图2,直接通过这个库来识别就可以。...

哇哦~ 9万+

python爬虫验证码的识别

python爬虫登录页面,自动识别验证码和输入登录

qq_41937821的博客 3280

【python爬虫实战】:不同验证码的自动识别

本文介绍了如何用 Python 爬虫识别各种类型的验证码,包括文字验证码、图像验证码和滑动验证码。虽然这些方法在一定程度上可以帮助我们突破验证码的屏障,但请注意,滥用这些技术可能会导致账户被封禁或其他法律风险。请在合法合规的前提下使用这些技术。

2301_82000445的博客 5878

字符型验证码识别

字符型验证码 一、验证码简介 1.什么是验证码 在开发爬虫的过程中会遇到一种常见的反爬措施,验证码。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。 2.验证码种类 验证码自面世以...

qq_20033707的博客 1148

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1342

15.网络爬虫—selenium验证码破解

一·selenium验证码破解 🧾 🧾网络爬虫是一种自动化程序,用于从Web页面中提取数据。然而,有些网站为了防止爬虫程序抓取数据,会加入一些验证码,使得程序无法自动化地完成数据采集任务。为了解决这个问题,我们可以使用selenium来破解验证码。 🧾 Selenium是一个开源的自动化测试工具,它可以模拟用户在浏览器中的操作,包括点击、输入等。使用selenium可以模拟用户手动输入验证码,从而实现验证码的破解。

weixin_50804299的博客 1万+

高精度计算Π的值(C语言)

题目要求 限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值。可以利用反三角函数幂级展开式来进行计算。 输入5 输出3.14159 思路分析 反三角函数幂级展开式 由公式可以看出,只要计算出来每一个R(n)的值再相加取二倍就可以得到Π的值。 经过推算,要是令R(1)=2,只需要将每个R(n),相加即可。 因...

weixin_46251155的博客 8033

【SWPUCTF 2021 新生赛】hardrce

对每个字符的ASCII值进行按位取反操作(这种要进行自增马进行绕过。

XiaoHei的博客 460

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

在当今数字化信息呈爆炸式增长的时代,网络爬虫宛如一把神奇的钥匙,开启了通往海量数据宝藏的大门。无论是商业领域的市场情报搜集、科研工作中的资料聚合,还是个人兴趣驱动下的信息整合,网络爬虫都展现出了无与伦比的价值。今天,就让我们一同走进 Python 网络爬虫的精彩世界,探索其中的奥秘。Python 网络爬虫为我们打开了一扇通往无限数据世界的大门,在商业、科研、生活等各个领域释放出巨大能量。通过掌握requestsScrapy等核心工具和框架,我们能够披荆斩棘,克服重重挑战,从网页的海洋中挖掘出珍贵的数据宝藏。

来自想要赚大钱的小周同学 9504

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

浅谈网络爬虫

浅谈网络爬虫 什么是网络爬虫? 爬虫能干什么 搜索引擎 抢票、刷票等自动化软件 部分破解软件 金融等行业数据挖掘、分析数据来源 其他 爬虫很简单 语言的选择 两种语言的小demo 爬虫也不简单 ip、浏览器头(User-Agent)、和cookie限制 需登录的验证码限制、参数限制 JavaScript渲染/ajax加密 爬虫知识储备路线 1.基础语法: 2.正则和爬虫相关库,以及浏览器F12...

bigsai 1万+

【PyTorch项目实战】图像分类与识别:手写数字识别(MNIST)、普适物体识别(CIFAR-10)

主要介绍了两个经典的实战项目:(1)基于 MNIST 数据集的手写数字识别(2)基于 CIFAR-10 数据集进行图像分类

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4401

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2030

Python3网络爬虫开发实战(8)验证码的识别

介绍了 tesserocr,ddddocr,深度学习,打码平台识别验证码的方法

bigcrab的博客 2099

久坐不慌,健康护航 —— 智能震动提醒坐垫的设计与实现

硬件核心:选用 ESP32 为主控,HX711 + 应变片实现精准压力检测,8050 三极管驱动震动马达,锂电池 + TP4056 满足便携供电需求;软件逻辑:核心是 “压力阈值判断 + 时间计时”,达到久坐阈值后触发震动提醒,流程图清晰体现了循环检测、状态重置的核心逻辑;代码特性:代码注释完善,阈值可灵活调整,支持串口调试,新手可直接编译烧录并根据实际场景校准。

weixin_42300449的博客 403

python网络爬虫之识别数字验证码

通过上图,我们可以发现,如果只是简单地进行灰度化处理,验证码地识别度并不和高,不能准确地识别出来。因此,我们可以通过图片二值化、线性降噪或者利用 Tesseract 进行验证码识别,来提高验证码的识别准确度。通过进一步的代码改进,验证码的识别有了很大的提高,识别出了0102,虽然正确的是0182,只有一个0和8的差距,但是我们仍然需要进一步地加强和改进代码。通过代码的进一步改进,验证码被准确识别成0812!

icey112的博客 1159

不会路由器叠加多条宽带?看这个就够了,能让你的局域网速度更快!

通常我们在企业网络或实际项目中,随着用户的增加,一条或者几条带宽不能满足正常使用,便可以对带宽进行叠加,便于网络带度更快;通常家里有可能有两条带宽的,联通或移动的,可能都是充话费送的,但网速都不怎么样,不用可惜,用之委屈,那怎么办呢?如在迅雷上开启下载,多个资源同时下载,此时总带宽可以达到120M,也就是WAN口带宽可以叠加。多wan口路由器, 一般是有2个wan口,分别为wan1与wan2。当然也有更多的wan口的。[1] 对整个局域网来说,出口带宽数量多了,相当于总带宽上升,这样是可以起到叠加效果。

qq_43416206的博客 1115

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

网络爬虫-----初识爬虫

网络爬虫的简单介绍,什么是网络爬虫?应用方面、以及就业前景,工作领域等等,进来看看吧!

m0_73633088的博客 3462

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: GBDT+LR算法解析及Python实现
下一篇: 这位机器学习大佬!他梳理了完整的学习路线!
Wang_AI
博客等级 码龄12年 997粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值