Python——12306图片验证码

2023-11-17

本次爬虫,我们来模拟一下12306的验证码验证
                         在这里插入图片描述

本次练习用到的模块:

  • requests
  • re
  • base64
  • urllib3

第一步,按F12查看验证码图片的信息:

在这里插入图片描述
提取URL:https://kyfw.12306.cn/passport/captcha/captcha-image64 (后面的参数不要)
提取requests的params参数内容:
在这里插入图片描述

第二步,先获取验证码的图片:

#coding=utf-8
import requests
import re
import urllib3
import base64

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
params = {
    "login_site": " E",
    "module": "login",
    "rand": "sjrand",
    "1556350688384": "",
    "callback": "jQuery1910650727092213933_1556350657738",
    "_":" 1556350657741"
}

# 1. 创建
session对象, 设置相关信息
session = requests.Session()
session.headers = headers
session.params = params

# 2. 发送请求, 是session不用管cookies
resp = session.get(url="https://kyfw.12306.cn/passport/captcha/captcha-image64", verify=False)

# 3. 数据处理
b64_image = re.findall(r'{"image":"(.*?)",', resp.text, re.S)[0]
image_data = base64.b64decode(b64_image)
with open(r"ca.jpg", "wb") as f:
    f.write(image_data)

在这里插入图片描述

第三步,坐标处理:

在这里插入图片描述
这是用来获取坐标的函数:

def position_count(args):
    """
    1 2 3 4
    5 6 7 8
    :param args:
    :return:
    """
    position_dict = {
        '1': '49,50',
        '2': '106,50',
        '3': '174,50',
        '4': '240,50',
        '5': '50,121',
        '6': '120,120',
        '7': '174,123',
        '8': '240,125',
    }
    position_data = []
    for i in args:
        position_data.append(position_dict.get(i))
    return ','.join(position_data)

在这里,我们要设置第二个params参数,传给检验验证码的url

# 4. 坐标整理
input_data = input("enter:") # 第几张图就输入几,空格分开
pic_num = input_data.split()  
pix_num = position_count(pic_num)
params = {
    "callback": "jQuery191014934245692777215_1556354228848",
    "answer": pix_num,  # answer是验证码的坐标
    "rand": "sjrand",
    "login_site": "E",
    "_": "1556354228850",
}

第四步,发送check:

这里的URL是检验验证码的URL,不是生成验证码的URL(可手动验证一次获取)

# 5. 发送check
session.params = params
resp = session.get(url="https://kyfw.12306.cn/passport/captcha/captcha-check", verify=False)
print(resp.text)

结果:

在这里插入图片描述

代码整合:

#coding=utf-8
import requests
import re
import urllib3
import base64

# requests关闭证书验证会警告,加上这个可以关闭警告
urllib3.disable_warnings()  
# 模拟点击验证图片
def position_count(args):
    """
    1 2 3 4
    5 6 7 8
    :param args:
    :return:
    """
    # 这是图片的坐标,模拟点击用
    position_dict = {
        '1': '49,50',
        '2': '106,50',
        '3': '174,50',
        '4': '240,50',
        '5': '50,121',
        '6': '120,120',
        '7': '174,123',
        '8': '240,125',
    }
    position_data = []
    for i in args:
        position_data.append(position_dict.get(i))
    return ','.join(position_data)



headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
params = {
    "login_site": " E",
    "module": "login",
    "rand": "sjrand",
    "1556350688384": "",
    "callback": "jQuery1910650727092213933_1556350657738",
    "_":" 1556350657741"
}

# 1. 创建session对象, 设置相关信息
session = requests.Session()
session.headers = headers
session.params = params

# 2. 发送请求, 是session不用管cookies
resp = session.get(url="https://kyfw.12306.cn/passport/captcha/captcha-image64", verify=False)

# 3. 数据处理
b64_image = re.findall(r'{"image":"(.*?)",', resp.text, re.S)[0]
image_data = base64.b64decode(b64_image)
with open(r"ca.jpg", "wb") as f:
    f.write(image_data)

# 4. 坐标整理
input_data = input("enter:")
pic_num = input_data.split()
pix_num = position_count(pic_num)
params = {
    "callback": "jQuery191014934245692777215_1556354228848",
    "answer": pix_num,
    "rand": "sjrand",
    "login_site": "E",
    "_": "1556354228850",
}

# 5. 发送check
session.params = params
resp = session.get(url="https://kyfw.12306.cn/passport/captcha/captcha-check", verify=False)
print(resp.text)

END
您的支持,是我前进的动力!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——12306图片验证码 的相关文章

  • 通过 add_subplot 添加子图后如何共享轴?

    我有一个像这样的数据框 df pd DataFrame A 0 3 0 2 0 5 0 2 B 0 1 0 0 0 3 0 1 C 0 2 0 5 0 0 0 7 D 0 6 0 3 0 4 0 6 index list abcd A B
  • 为什么 Python 在导入脚本时只保存脚本的字节码?

    既然执行Python字节码会比运行原始源代码更快 因为Python不需要重新编译 为什么Python在导入脚本时只保存编译后的字节码呢 为每个执行的脚本保存 pyc 文件不是更好吗 无论如何 Python 解释器的启动时间都需要时间 即使您
  • Python 转换矩阵

    我有一个如下所示的列表 2 1 3 1 2 3 1 2 2 2 我想要的是一个转换矩阵 它向我显示如下序列 1 后跟 1 的频率是多少 1 后面跟着 2 的频率是多少 1 后跟 3 的频率是多少 2 后跟 1 的频率是多少 2 后跟 2 的
  • 如何使用一个模型中间层的输出作为另一个模型的输入?

    我训练一个模型A并尝试使用中间层的输出name layer x 作为模型的附加输入B 我尝试像 Keras 文档一样使用中间层的输出https keras io getting started faq how can i obtain th
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • 无法在 virtualenv 中安装 libxml2

    我有一个问题libxml2蟒蛇模块 我正在尝试将其安装在python3 虚拟环境使用以下命令 pip install libxml2 python3 但它显示以下错误 Collecting libxml2 python3 Using cac
  • django 模板 - 如何动态访问变量?

    假设我有一个具有以下上下文的 django 模板 data1 this is data1 data2 this is data2 data name data2 现在我知道了data name 假设它是 data2 是否可以用它来访问变量d
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • ValueError:数据必须为正(boxcox scipy)

    我正在尝试将我的数据集转换为正态分布 0 8 298511e 03 1 3 055319e 01 2 6 938647e 02 3 2 904091e 02 4 7 422441e 02 5 6 074046e 02 6 9 265747e
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • 更改 Matplotlib 投影轴的背景颜色

    我正在尝试使用 Cartopy 创建一个图形 该图形需要在未投影的轴上绘制投影轴 这是一个尽可能简单的代码版本 它将轴上的内容替换为背景颜色 import matplotlib pyplot as plt import cartopy cr
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • Django 2、python 3.4 无法解码 urlsafe_base64_decode(uidb64)

    我正在尝试通过电子邮件激活用户 电子邮件有效 编码有效 我使用了 django1 11 中的方法 该方法运行成功 在 Django 1 11 中 以下内容成功解码为 28 其中 uidb64 b Mjg force text urlsafe
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to

随机推荐

  • js多目运算符的判断写法

    1 两目运算 orderStatus item order id active 2 三目运算 orderStatus 0 待付款 orderStatus 1 待发货 orderStatus 2 待收货 待评价
  • 机器学习笔记(一)

    统计学习三要素 模型 策略和算法 模型分类有几种 监督非监督 参数非参数等 监督学习又分为生成方法和判别方法 生成模型有 朴素贝叶斯和隐马尔科夫 判别模型有 K近邻 感知机 决策树 逻辑回归 EM SVM Boost CRF 参数与非参数
  • pytorch 梯度爆炸调试方法

    调试模式下运行代码 并按以下代码设置torch配置 torch autograd set detect anomaly True with torch autograd detect anomaly loss loss func 发生梯度爆
  • 算法分析与设计作业4:归并排序

    1 问题 二分归并排序 对n个不同的数构成的数组A 1 n 进行排序 其中n 2 k 标题 2 解析 先将杂乱的数字两两分组 对两个数字比较大小进行排序 再将两个排序好的数组按顺序归并 依此循环k次 直至所有小数组被归并为完整的大数组 3
  • 组合逻辑毛刺消除(竞争冒险)

    一 毛刺产生的原因 信号在 IC FPGA 器件中通过逻辑单元连线时 是存在延时的 延时的大小不仅和连线的长短和逻辑单元的数目有关 而且也和器件的制造工艺 工作环境等有关 因此 信号在器件中传输的时候 所需要的时间是不能精确估计的 当多路信
  • tauri打包慢:解决tauri的打包慢以及超时的方法

    打包的命令 yarn tauri build 打包的时候 会下载一个依赖包 由于这个依赖包是在github上下载的 因此会很慢或者超时 可以将这个地址 https github com wixtoolset wix3 releases do
  • STM32在线升级 (IAP)

    来自QQ群 Linux 技术分享 311078264 打开链接加入QQ群 https jq qq com wv 1027 k 5Gr3bAx 此文档由elikang整理 为了文章简单直接 许多细节未能在文章中体现 如有疑问请进群讨论 STM
  • GPT-4 VS GPT-3.5!你需要升级plus版本吗?

    GPT 4和 GPT 3 5语言模型在前沿技术的推动下 都具备了相当出色的自然语言生成能力 鉴于GPT 4正式发布的消息已经引发了不小的关注 本文将从完善度测试 推理能力测试 创造力测试三个角度探讨两者的区别和优劣 为您提供实用的指导 帮助
  • u-input改变输入框内的字体样式

    编辑uview的组件input 由于我的项目背景是蓝色 因此要改变input组件的字体颜色 刚开始我的思路是 直接找到u input组件的class 但是这样设置的话 会导致所有的input内文字都变成我设置的颜色 综合网上的信息 我的处理
  • 刷脸支付也将进一步助力生活生产智能化

    支付宝和微信支付竞相发起 扫货节 和 智慧生活日 活动 不约而同地聚焦刷脸支付 用刷脸支付立减 免单的方式鼓励广大消费者投入刷脸支付的怀抱 毫无疑问 刷脸支付是大数据和人工智能时代的产物 同时 刷脸支付也将进一步助力生活生产智能化 为智慧营
  • 《HTML标签》〈ul〉〈ol〉〈li〉的使用

    li 标签定义和用法 li li 标签定义列表项目 li li 标签可用在有序列表 ol 和无序列表 ul 中 ol 标记 称为有序列表 编号列表标记 其功能是将文字段落向内缩进 并在段落的每个项目前面加上1 2 3 有顺序的数字 ol 标
  • Could not find com.android.support:appcompat-v7:23.1.1 问题解决

    allprojects repositories jcenter maven url https maven google com 添加这个就可以
  • 毛坯装修知识

    硬装指的是装修阶段必须完成的项目 而且一旦完成 很难改动 软装基本就是搬家时能够搬走的那些东西 最简单的区别就是 把屋子倒过来 会掉下来的就是软装 掉不下来的就是硬装 家具电器 窗帘布艺 装饰挂画等等都算软装 插座 门 地板瓷砖这些 更换起
  • 融合零样本学习和小样本学习的弱监督学习方法综述

    融合零样本学习和小样本学习的弱监督学习方法综述 人工智能技术与咨询 来源 系统工程与电子技术 作者潘崇煜等 摘 要 深度学习模型严重依赖于大量人工标注的数据 使得其在数据缺乏的特殊领域内应用严重受限 面对数据缺乏等现实挑战 很多学者针对数据
  • 小程序之坑---input自动获取焦点

    项目 taro3 vue3 taro ui vue3 方法一 taro ui vue3的input组件的autoFocus focus无效 方法二 原生input组件的auto focus在这个环境下也无效 但是在原生项目中有效 方法三 通
  • js里document的用法

    document write 动态向页面写入内容 document createElement Tag 创建一个html标签对象 document getElementById ID 获得指定ID值的对象 document getEleme
  • mysql 两个时间相减返回年、月、日、时、分、秒

    select timestampdiff 变量 开始时间 结束时间 变量 year 年 month 月 day 天 hour 小时 minute 分钟 second 秒 例如
  • 由Vite读音引发的英语颠覆

    前段时间出了个项目Vite 被读成va t 结果后面发现是读vi t 后面又引出了height的读音 我们有些人读he t 有些人读ha t 结果是读ha t 我也是读了20年的he t 因为有个weight是读we t的 所以想当然的以为
  • 对象和字符串之间的相互转换

    原文链接 对象和字符串之间的相互转换 编程屋 相关依赖
  • Python——12306图片验证码

    本次爬虫 我们来模拟一下12306的验证码验证 本次练习用到的模块 requests re base64 urllib3 第一步 按F12查看验证码图片的信息 提取URL https kyfw 12306 cn passport captc