「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平台,现在多种平台都有对应的免费次数,这里就不在一一介绍了。

本文完。🪄🪄🪄
相关文章
|
1月前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
1月前
|
数据采集 Web App开发 JavaScript
无头浏览器技术:Python爬虫如何精准模拟搜索点击
无头浏览器技术:Python爬虫如何精准模拟搜索点击
|
1月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
2月前
|
数据采集 存储 前端开发
Python爬虫自动化:批量抓取网页中的A链接
Python爬虫自动化:批量抓取网页中的A链接
|
2月前
|
数据采集 存储 NoSQL
Python爬虫Cookie管理最佳实践:存储、清理与轮换
Python爬虫Cookie管理最佳实践:存储、清理与轮换
|
文字识别 Python
关于利用python进行验证码识别的一些想法
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi         用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。
1056 0
|
4月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
2月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
89 11
|
4月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
140 28

推荐镜像

更多