「Python」爬虫-7.验证码的识别

简介: > 本文主要介绍如何处理一些网页中简单的验证码问题。~~(只提供简单的思路,随着技术的发展,一些验证码已经防范的非常好了,一般的解决方法可能过不了验证码这一关🤺~~

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天, 点击查看活动详情

本文主要介绍如何处理一些网页中简单的验证码问题。 (只提供简单的思路,随着技术的发展,一些验证码已经防范的非常好了,一般的解决方法可能过不了验证码这一关🤺

关于爬虫相关,欢迎先阅读一下我的前几篇文章😶‍🌫️😶‍🌫️😶‍🌫️:

「Python」爬虫-1.入门知识简介 - 掘金 (juejin.cn)

「Python」爬虫-2.xpath解析和cookie,session - 掘金 (juejin.cn)

「Python」爬虫-3.防盗链处理 - 掘金 (juejin.cn)

「Python」爬虫-4.selenium的使用 - 掘金 (juejin.cn)

「Python」爬虫-5.m3u8(视频)文件的处理 - 掘金 (juejin.cn)

「Python」爬虫-6.爬虫效率的提高 - 掘金 (juejin.cn)


我们在网站登录或者注册的时候,或多或少都会遇到要输入验证码的情况,比如下面这种情况:

image.png

这时候我们就需要借助外部力量 来破解这种奇怪的东西了。

这里介绍超级鹰平台提供的方法对一般的验证码进行处理,识别出图中的码,直接模拟向编辑框填入东西即可。

验证码--超级鹰

关于如何使用超级鹰,下面给出一段模板代码:

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5


class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                          headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('xxxxxx', 'xxxxx', '924155')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('code.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))  # 1902 验证码类型  官方网站>>价格体系 

如果你想要使用超级鹰的接口的话,只需要修改图中的数据即可
image.png

Chaojiying_Client中传入的分别为用户名,用户密码,以及需要到该平台的用户中心找到自己账号对应的软件ID。然后可以随便找一张验证码的图片,调用.PostPic方法即可,传入的参数见官网验证码类型。

虽然说超级鹰自己是一个提供验证码破解的平台,但是他自己本身网站登录的时候也需要输入验证码。那么?🫠,让他自己处理自己平台的验证码有没有可能呢?!

那必然是可以的,接下来就准备试试~
超级鹰处理超级鹰

我们这里图方便,仍然使用之前提到过的selenium,注意,需要将前面模板提到的Chaojiying_Client先复制过来!

然后找到目标网址http://www.chaojiying.com/user/login

实例化对象

web = Chrome()
web.get("http://www.chaojiying.com/user/login/")

F12键找找到验证码图片所在的位置

img = web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png

再交给超级鹰去处理

chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '924155')
dic = chaojiying.PostPic(img, 1902)
verify_code = dic['pic_str']

最后就是模拟填入了,相信这个大家一定会了吧~

完整代码如下:

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
import time
from chaojiying import Chaojiying_Client

web = Chrome()

web.get("http://www.chaojiying.com/user/login/")

# 处理验证码
img = web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '924155')
dic = chaojiying.PostPic(img, 1902)
verify_code = dic['pic_str']

# 向页面中填入用户名,密码,验证码
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys("xxxx")
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys("xxxx")
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(verify_code)

time.sleep(5)
# 点击登录
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()

处理完简单的验证码,接下来我们上一点难度,先来看看12306的登录吧

处理12306登录

image.png

鬼畜的图片识别

12306的登录页面是属于人机交互的感觉,超级鹰仍然集成了这种识别的解决方法。

通过dic = chaojiyiing.PostPic(verify_img,9004)就可以对该种验证码进行处理了,dic['pic_str']就可以得到一个及以上的图片位置坐标。返回形式为x1,y1|x2,y2|...

通过.split("|")就可以得到多个符合条件的图片坐标。得到坐标之后,就需要让鼠标移动到对应的坐标位置上去。

这里通过ActionChains(web).move_to_element_with_offset(verify_img,x,y)方法就可以移动到对应的位置坐标上去。

移动到相对应的位置之后,就需要点击了,这里通过.click().perform()方法模拟点击。

完整代码如下:

from selenium.webdriver.common.action_chains import ActionChains

# 初始化超级鹰
chaojiying = Chaojiying_Client('2xxxxg', '1xxxxx', '924155')

verify_img = web.find_elelment(By.XPATH,'xxx').screenshot_as_png
# 用超级鹰识别验证码
dic = chaojiyiing.PostPic(verify_img,9004)
result = dic['pic_str'] # 返回格式:x1,y1|x2,y2..
rs_list = result.split("|")
for rs in rs_list:  # x1,y1
    p_temp = rs.split(",")
    x = int(p_temp[0])
    y = int(p_temp[1])
    # 要让鼠标移动搭配某个位置
    ActionChains(web).move_to_element_with_offset(verify_img,x,y).click().perform()
    # 以图片为基准点,偏移量x,y

除了超级鹰可以提供验证码识别的接口之外,百度也有相应的API平台,现在多种平台都有对应的免费次数,这里就不在一一介绍了。

本文完。🪄🪄🪄
相关文章
|
2天前
|
机器学习/深度学习 Python
【Python实战】——神经网络识别手写数字(三)
【Python实战】——神经网络识别手写数字
|
2天前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(二)
【Python实战】——神经网络识别手写数字(三)
|
2天前
|
数据采集 Web App开发 数据处理
Lua vs. Python:哪个更适合构建稳定可靠的长期运行爬虫?
Lua vs. Python:哪个更适合构建稳定可靠的长期运行爬虫?
|
2天前
|
数据采集 文字识别 测试技术
神器!使用Python 轻松识别验证码
本文介绍了使用Python进行验证码识别,主要包括安装Tesseract OCR和相关Python库,如`pytesseract`和`opencv-python`。通过Pillow加载验证码图片,使用`pytesseract`进行简单数字验证码识别。对于数字字母混合的验证码,先进行二值化和降噪处理,然后使用`cv2.findContours`分割字符并分别识别。这种方法适用于自动化测试和爬虫中的验证码处理。
22 2
|
2天前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(一)
【Python实战】——神经网络识别手写数字
|
2天前
|
数据采集 Web App开发 Java
Python 爬虫:Spring Boot 反爬虫的成功案例
Python 爬虫:Spring Boot 反爬虫的成功案例
|
2天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
python 数字验证码 自动识别
5月更文挑战第4天
25 3
|
2天前
|
数据采集 Python
使用Python实现简单的Web爬虫
本文将介绍如何使用Python编写一个简单的Web爬虫,用于抓取网页上的信息。通过分析目标网页的结构,利用Python中的requests和Beautiful Soup库,我们可以轻松地提取所需的数据,并将其保存到本地或进行进一步的分析和处理。无论是爬取新闻、股票数据,还是抓取图片等,本文都将为您提供一个简单而有效的解决方案。
|
文字识别 开发工具 Python
Python编程:通过百度文字识别提取表格数据
Python编程:通过百度文字识别提取表格数据
197 0
Python编程:通过百度文字识别提取表格数据
|
1天前
|
网络协议 Unix Python
Python编程-----网络通信
Python编程-----网络通信
8 1