爬虫中使用第三方打码平台(识别验证码)

news2024/9/24 17:20:25

引入

在爬虫程序中,常常会遇到验证码校验的关卡,人工识别不仅慢而且很费精力,使用打码平台就成了高效,省时且便利的选择。

本次案例对于高清资源库1080zyk.com进行爬虫采集,使用超级鹰验证码识别(chaojiying.com)和python的requests库具体实现,类似的第三方打码库还有云打码,tt图鉴ddddorc库等

代码实现

在这里插入图片描述
首先我们对网页进行分析,通过键入搜索框,并点击搜索按钮,F12中的网络接口可以找到,发起了两次请求

  • post请求,将搜索框里的内容通过表单数据data发送给服务器

在这里插入图片描述

  • get请求,返回的是验证码的图片

在这里插入图片描述

所以我们先编写如下代码,将图片保存本地,使用Session对象是为了保证验证码和请求是同一次会话

import requests

# 爬取优质资源网
session = requests.Session()

urls = {
    "data": "http://www.1080zyk.com/index.php?m=vod-search",
    "yanzenma": "https://www.1080zyk.com/inc/common/code.php?a=search&s=",
}

for key, url in urls.items():
    if key == "data":
        data = {"wd": "python", "submit": "search"}
        response = session.post(url, data=data)
        print(response.text)
    elif key == "yanzenma":
        response = session.get(url)
        # response是一张图片
        with open("./yanzenma.jpg", "wb") as f:
            f.write(response.content)
        print("验证码已保存到yanzenma.jpg")

超级鹰平台的使用

然后登陆到超级鹰打码平台,下载相应语言的接口示例

在这里插入图片描述

把python源文件解压到项目目录下,修改里面的参数,自己去超级鹰网站生成软件id,填入替换96001

在这里插入图片描述

在这里插入图片描述

导入类

在你的爬虫文件中导入超级鹰类,替换参数和图片地址,原本打印出来的是一个字典,我们取他的pic_str

在这里插入图片描述

可以看到,最后获取到了正确的验证码值

JavaScript逆向

在这里插入图片描述

检查验证码页面,发现主要内容是一段js代码实现检验功能,于是,我们把这段代码给复制下来,交给fittencode解释.

fittenCode插件

结果如下:

$(".ldg_verify_submit").click(() => {
            const code = $(".mac_verify").val();
            const type = $("#code_type").val();
            $.get("/inc/ajax.php?ac=code_check&code=" + code + "&type=" + type + "&rnd=" + Math.random(), function (r) {
                const data = JSON.parse(r);
                if (data.code == 1) {
                    location.reload();
                } else {
                    alert(data.msg);
                }
            });
        })
帮我解释一下这段代码

这段代码是一个使用jQuery编写的JavaScript代码片段,主要功能是处理一个验证提交按钮的点击事件。以下是对这段代码的详细解释:

  1. $(".ldg_verify_submit").click(() => { ... })

    • 这行代码监听类名为ldg_verify_submit的元素的点击事件。当该元素被点击时,执行箭头函数内的代码。
  2. const code = $(".mac_verify").val();

    • 这行代码获取类名为mac_verify的元素的值,并将其存储在变量code中。通常,这个元素可能是一个输入框,用户在这里输入验证码。
  3. const type = $("#code_type").val();

    • 这行代码获取ID为code_type的元素的值,并将其存储在变量type中。这个元素可能也是一个输入框或下拉菜单,用于选择验证码的类型。
  4. $.get("/inc/ajax.php?ac=code_check&code=" + code + "&type=" + type + "&rnd=" + Math.random(), function (r) { ... })

    • 这行代码使用jQuery的$.get方法发送一个GET请求到服务器。请求的URL是/inc/ajax.php,并附带以下查询参数:
      • ac=code_check:表示执行的操作是验证码检查。
      • code= + code:传递用户输入的验证码。
      • type= + type:传递验证码的类型。
      • rnd= + Math.random():添加一个随机数,以避免浏览器缓存。
  5. const data = JSON.parse(r);

    • 这行代码将服务器返回的JSON字符串解析为JavaScript对象,并存储在变量data中。
  6. if (data.code == 1) { location.reload(); } else { alert(data.msg); }

    • 这行代码检查解析后的data对象中的code属性。如果code等于1,表示验证成功,页面将重新加载(location.reload())。如果code不等于1,表示验证失败,弹出一个警告框显示data.msg中的错误信息(alert(data.msg))。

总结来说,这段代码的功能是当用户点击验证提交按钮时,获取用户输入的验证码和验证码类型,然后通过AJAX请求将这些信息发送到服务器进行验证。根据服务器的响应,决定是重新加载页面(验证成功)还是显示错误信息(验证失败)。

于是我们将参数拼接,对https://www.1080zyk.com/inc/ajax.php?ac=code_check&code=3991&type=search&rnd=1发起请求,最后得到响应数据为{"code":1,"msg":"ok"},然后reload页面,发现,可以正常获得响应,于是,补充下列代码
在这里插入图片描述

# 校验验证码url
url = f"http://www.1080zyk.com/inc/ajax.php?ac=code_check&code={code}&type=search&rnd={random.randint(100000, 999999)}"

response_code = session.get(url)
if response_code.json()["code"] == 1:	# 注意,不是字符串1
    print("验证码正确")
    print(session.get(urls["data"]).text)
else:
    print("验证码错误")

最后,加入选择下载项和保存本地的代码,就完成了

import random
import requests
import lxml.etree
from 超级鹰接口 import Chaojiying_Client

# 初始化会话
session = requests.Session()

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
    "Cookie": "_ga=GA1.1.838502423.1724576396; PHPSESSID=o15hha1hpqlbddfon13h85rt37; _ga_20DNV0Q96J=GS1.1.1724591590.4.1.1724591970.0.0.0",
}

urls = {
    "data": "http://www.1080zyk.com/index.php?m=vod-search",
    "yanzenma": "https://www.1080zyk.com/inc/common/code.php?a=search&s=",
}


def fetch_captcha():
    response = session.get(urls["yanzenma"])
    with open("./yanzenma.jpg", "wb") as f:
        f.write(response.content)
    print("验证码已保存到yanzenma.jpg")


def recognize_captcha():
    chaojiying = Chaojiying_Client(
        "","",1
    )  # 用户中心>>软件ID 生成一个替换 96001
    im = open(
        "./yanzenma.jpg", "rb"
    ).read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    result = chaojiying.PostPic(im, 1902).get(
        "pic_str"
    )  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    return result


def verify_captcha(code):
    url = f"http://www.1080zyk.com/inc/ajax.php?ac=code_check&code={code}&type=search&rnd={random.randint(100000, 999999)}"
    response_code = session.get(url)
    return response_code.json()


def search_data():
    data = {"wd": "你好", "submit": "search"}
    response = session.post(urls["data"], data=data)
    return response.text


def parse_data(html):
    tree = lxml.etree.HTML(html, None)
    base_xpath = "//div[@class='xing_vb']/ul/li"
    items = tree.xpath(base_xpath)

    nums = [
        {"标题": 1, "类别": 2, "地区": 3, "评分": 4, "更新时间": 5},
        {
            "链接": "span[2]/a/@href",
            "标题": "span[2]/a/text()",
            "类别": "span[3]/text()",
            "地区": "span[4]/text()",
            "评分": "span[5]/text()",
            "更新时间": "span[6]/text()",
        },
    ]

    index = 1
    for item in items:
        if index == 1:
            for name, num in nums[0].items():
                name_value = item.xpath(f"./span[{num}]/text()")[0]
                print(name_value)
            index += 1
        else:
            for name, path in nums[1].items():
                name_value = item.xpath(f"./{path}")[0]
                print(name_value)


def main():
    fetch_captcha()
    # code = recognize_captcha()
    code = input("请输入验证码:")
    result = verify_captcha(code)
    if result["code"] == 1:
        print("验证码正确")
        html = search_data()
        parse_data(html)
    else:
        print("验证码错误")


if __name__ == "__main__":
    main()

后面发现,js中使用reload刷新页面,一开始没注意,所以使用简单的requests库满足不了,可以改用selenium操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS的动画效果

动画效果 语法: 创建动画:keyframes 调用动画:animation animation参数值 参数值效果animation-name规定 keyframes 动画的名称。animation-duration规定动画完成一个周期所花费的秒或毫秒。默认是 0animation-timing-function规定动画的速…

ZBrush入门使用介绍——11、边缘环

大家好,我是阿赵。   继续介绍ZBrush的用法。这次看看边缘环的使用方法。我个人的感觉,边缘环有点类似于3DsMax之类软件的挤出功能,可以沿着环形的面,添加凹凸效果。   边缘环工具入口在几何体编辑里面: 一、 边…

AI大语言模型之分布式训练概述

一、前言 随着语言模型参数量和所需训练数据量的急速增长,单个机器上有限的资源已无法满足大语言模型训练的要求。需要设计分布式训练(Distributed Training)系统来解决海量的计算和内存资源需求问题。 在分布式训练系统环境下需要将一个模…

关于java中Excel的导入导出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、配置pom依赖二、搭建utils工具类1.Excel表头设置表2.Excel导入导出工具类3.Excel导出配置4.Excel导入配置 三、添加user表和工具类使用方法1.user表设置2.工…

uni-app开发日志:新增页和修改页因字段太多用分段器实现分段分类

schema2code默认只能实现较为简单的分组,当填写项目较多的时候,肯定是用选项卡明确分段比较合适,这时候schema2code自生成的就没法实现了,摒着最最少的代码修改来尝试设置生成前的schema和生成后的vue页面。 一、schema设计 先把…

【Hot100】LeetCode—46. 全排列

目录 1- 思路回溯 2- 实现⭐46. 全排列——题解思路 3- ACM 实现 题目连接:46. 全排列 1- 思路 回溯 由于是排列问题,需要讲究元素顺序。元素相同顺序不同是不同的排列,而组合问题不强调元素顺序。组合中的 startIndex 是用来保证&#xff…

如何用Java SpringBoot+Vue打造法律援助平台?毕业设计全攻略

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

【区间dp】 CF607B Zuma 题解

题面翻译 Genos \texttt{Genos} Genos 最近在他的手机上下载了祖玛游戏。在祖玛游戏里,存在 n ( 1 ≤ n ≤ 500 ) n(1\leq n\leq 500) n(1≤n≤500) 个一行的宝石,第 i i i 个宝石的颜色是 C i C_i Ci​。这个游戏的目标是尽快的消灭一行中所有的宝石…

python 实现zellers congruence泽勒一致算法

zellers congruence泽勒一致算法介绍 Zeller’s Congruence(泽勒一致算法)是一种用于计算给定日期是星期几的算法。这个算法可以处理公历(Gregorian calendar)和儒略历(Julian calendar)日期。其核心公式如…

SpringBoot实战:Spring Boot项目使用SM4国密加密算法

引言 在业务系统构建与部署的环节中,数据库作为核心存储组件,其连接信息的安全至关重要。通常情况下,这些敏感信息,如数据库密码,会直接以明文形式存储在YAML配置文件中,这无疑增加了信息泄露的风险。为有效…

用EA和SysML一步步建模的操作指南(01)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 对于许多学习SysML和MBSE的同学来说,比较头痛的问题之一是:各种各样的教程里给出的案例,图都是画好了的!如何从零开始用建模工具把模型画…

【企业级】像素流管理平台 V1.0

在当今快速发展的数字世界里,虚幻引擎的像素流技术为用户带来了前所未未有的视觉体验和交互方式。为了进一步提升开发效率和用户体验,我们【企业级】像素流管理平台 V1.0应运而生。通过一系列精心设计的功能,这个平台不仅简化了开发流程&…

解锁流量密码!财谷通助力抖音小店优势最大化!

在数字经济蓬勃发展的今天,电商平台如雨后春笋般涌现,其中,抖音小店以其独特的短视频直播模式,成为了众多商家和消费者青睐的新宠。而提及四川财谷通信息技术有限公司在抖音平台上开设的小店,其可靠性更是备受瞩目。本…

初识AOP

Spring有两个核心的概念,一个是IOC/DI,一个是AOP。 AOP是在不改原有代码的前提下对其进行增强。 对于下面的内容,我们主要就是围绕着这一句话进行展开学习,主要学习两方面内容AOP核心概念,AOP作用: 1 什么是AOP? AOP(Aspect O…

【2024】10个好用的AI搜索引擎大盘点

在2024年,随着人工智能技术的飞速发展,AI搜索引擎已经成为我们日常生活中不可或缺的一部分。这些基于人工智能技术的搜索引擎不仅提供了更快速、更准确的搜索体验,还通过自然语言处理(NLP)和机器学习(ML&am…

ECharts tooltip默认html样式,保留样式只对数据数值格式化

之前遇到过需要对数据进行百分比展示,echarts提供的默认样式还是挺好的所以想保留样式,但是设置了formatter默认样式就没了,所以写了formatter的html字符串模拟还原了一下默认样式,在此记录和分享。 适用场景:对数据进…

Datawhale X 李宏毅苹果书 AI夏令营 task1

3.1 局部极小值与鞍点 在深度学习的优化过程中,模型的损失函数可能会在某些点处停止下降,即使我们希望进一步降低损失。这一章节探讨了导致这一现象的原因,包括局部极小值、鞍点,以及其他临界点。理解这些概念能够帮助优化神经网…

注册资本登记新规14问

2023年12月29日修订的《公司法》第四十七条规定,全体股东认缴的出资额由股东按照公司章程的规定自公司注册成立之日起五年内缴足。根据这个规定,存量公司注册资本缴纳期限如何调整还需要进一步明确规定。 就在新公司法正式实施的同一天,2024…

AI新格式超越SD,更轻更快的Flux

随着《黑神话悟空》的横空出世,全民“天命人”大杀四方。 与此同时,AI绘画大模型领域也是群雄逐鹿。 Stable Diffusion作为开源AI绘画大模型鼻祖,推出了SD3,但因为加入了对身体的限制(防止涩涩)&#xff…

【架构-24】XML和JSON

XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种常用的数据格式,用于在不同系统之间传输和交换数据。它们各有优点和缺点,适用于不同的场景。下面是对XML和JSON的简要介绍以及它们之间的对比。 XM…