详解python 爬取12306验证码

接下来我将为你详细讲解“详解Python爬取12306验证码”的完整攻略。

1. 前言

在进行python爬虫时,验证码的破解常常是很重要的一步。而12306验证码的破解则是很多人首次接触验证码破解时的练手项目。本文将详细介绍如何使用Python来爬取12306的验证码。

2. 前置要求

在开始之前,需要满足以下前置要求:

  • 安装Python 2.X或3.X版本
  • 安装requests库
  • 安装Pillow库
  • 确定12306的验证码接口路径

3. 步骤

3.1 获取验证码图片

我们可以使用如下代码:

import requests
from PIL import Image

def get_captcha():
    url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    response = requests.get(url)
    img_base64 = response.json()['image']
    with open('captcha.png', 'wb') as f:
        f.write(img_base64.decode('base64'))
    img = Image.open('captcha.png')
    img.show()

if __name__ == '__main__':
    get_captcha()

在该代码中,我们首先使用requests库向12306的验证码接口请求验证码图片数据,并将返回的数据中‘image’字段保存为本地的验证码图片文件。接下来,我们使用Pillow库中的Image.open()方法打开该图片,并使用show()方法将其展示出来。

这里我使用的是requests库以及Pillow库,你也可以根据自己的需求来选择使用其他库实现同样的功能。

3.2 自动识别验证码

如果你并不想手动输入验证码,那么可以使用tesseract-OCR。tesseract-OCR作为一款OCR引擎,不仅支持识别验证码图形,还支持多种语言的识别。

安装tesseract-OCR后,我们可以在原有的代码中添加自动识别验证码的功能:

import requests
import pytesseract
from PIL import Image

def get_captcha_text():
    url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    response = requests.get(url)
    img_base64 = response.json()['image']
    with open('captcha.png', 'wb') as f:
        f.write(img_base64.decode('base64'))
    img = Image.open('captcha.png')
    text = pytesseract.image_to_string(img)
    return text

if __name__ == '__main__':
    captcha_text = get_captcha_text()
    print(captcha_text)

在该代码中,我们首先使用requests库向12306的验证码接口请求验证码图片数据,并将返回的数据中‘image’字段保存为本地的验证码图片文件。接下来,我们使用Pillow库中的Image.open()方法打开该图片,并使用pytesseract库中的image_to_string()方法自动识别验证码。

3.3 将识别结果提交到服务器

最后,我们可以将识别结果提交到服务器,以此完成登录过程。在该过程中,可能需要使用session等机制维持登录状态,具体操作可以参考Python的requests和cookies相关API。

示例一:

import requests
import pytesseract
from PIL import Image

def login(username, password):
    login_url = 'https://kyfw.12306.cn/otn/login/init'
    captcha_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    captcha_check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
    headers = {
        'Host': 'kyfw.12306.cn',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        'Referer': 'https://kyfw.12306.cn/otn/login/init'
    }
    session = requests.session()
    session.get(login_url, headers=headers)
    captcha_text = get_captcha_text()
    data = {
        'answer': captcha_text,
        'login_site': 'E',
        'rand': 'sjrand'
    }
    response = session.post(captcha_check_url, data=data, headers=headers)
    if response.json()['result_code'] == '4':
        print('验证码校验通过!')
    else:
        print('验证码校验失败!')
        return False
    data = {
        'username': username,
        'password': password,
        'appid': 'otn'
    }
    response = session.post(login_url, data=data, headers=headers)
    if response.json()['result_code'] == 0:
        print('登录成功!')
        return True
    else:
        print('登录失败!')
        return False

def get_captcha_text():
    url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    response = requests.get(url)
    img_base64 = response.json()['image']
    with open('captcha.png', 'wb') as f:
        f.write(img_base64.decode('base64'))
    img = Image.open('captcha.png')
    text = pytesseract.image_to_string(img)
    return text

if __name__ == '__main__':
    login('your_username', 'your_password')

在该代码中,我们使用requests库创建了一个session对象,并分别请求了登录页面、验证码图片以及验证码校验接口。在验证码校验中,我们传递了自动识别出的结果,并通过检查返回的json数据中‘result_code’字段判断验证码是否识别正确。在成功校验验证码后,我们以同样的方式提交了用户名和密码,并最终判断了登录结果(通过判断返回的json数据中‘result_code’字段)。

示例二:

import requests
import pytesseract
from PIL import Image

session = requests.session()

def get_captcha_text():
    url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    response = session.get(url)
    img_base64 = response.json()['image']
    with open('captcha.png', 'wb') as f:
        f.write(img_base64.decode('base64'))
    img = Image.open('captcha.png')
    text = pytesseract.image_to_string(img)
    return text

def get_cookie():
    url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64'
    response = session.get(url)
    cookie = response.cookies['RAIL_EXPIRATION']
    cookie = str(int(cookie) + 60 * 60 * 24 * 30)
    return cookie

def login(username, password):
    login_url = 'https://kyfw.12306.cn/otn/login/init'
    captcha_check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
    headers = {
        'Host': 'kyfw.12306.cn',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer': 'https://kyfw.12306.cn/otn/login/init'
    }

    captcha_text = get_captcha_text()
    data = {
        'answer': captcha_text,
        'login_site': 'E',
        'rand': 'sjrand'
    }
    response = session.post(captcha_check_url, data=data, headers=headers, cookies=session.cookies.get_dict())
    if response.json()['result_code'] == '4':
        print('验证码校验通过!')
    else:
        print('验证码校验失败!')
        return False

    cookie = get_cookie()
    headers.update({
        'Cookie': 'RAIL_EXPIRATION={};RAIL_DEVICEID=your_device_id'.format(cookie)
    })

    data = {
        'username': username,
        'password': password,
        'appid': 'otn'
    }
    response = session.post(login_url, data=data, headers=headers, cookies=session.cookies.get_dict())
    if response.json()['result_code'] == 0:
        print('登录成功!')
        return True
    else:
        print('登录失败!')
        return False

if __name__ == '__main__':
    login('your_username', 'your_password')

在该代码中,我们依然是先获取并识别验证码,但是在验证码校验与登录过程中增加了许多细节操作。为了避免被封IP,我们获取了cookie中的RAIL_EXPIRATION,将其增加了30天的有效期后放回cookie中。在请求登录接口时,我们还需要将获取到的cookie作为请求头的一部分传递。

4. 总结

以上便是详解Python爬取12306验证码的攻略完整过程和示例。在实际应用中,要注意识别精度、请求频率等问题,避免被封IP。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python 爬取12306验证码 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python for循环你了解吗

    Python中的for循环是常见的循环结构之一,它可以依次遍历序列类型的数据元素,比如列表、元组、字符串等。 语法 for 变量 in 可迭代对象: # 循环体 其中,变量表示当前遍历的元素,可迭代对象表示要遍历的数据序列。冒号后面的部分为循环体,需要缩进表示属于循环范围内的代码块。 示例一:遍历列表 fruits = [‘apple’, ‘banana’,…

    python 2023年6月3日
    00
  • python判断给定的字符串是否是有效日期的方法

    下面是详细讲解“python判断给定的字符串是否是有效日期的方法”的攻略: 步骤一:导入模块 首先,我们需要导入Python的datetime模块,它提供了日期和时间的处理功能。 import datetime 步骤二:定义日期格式 接着,我们需要定义日期格式。常见的日期格式有多种,比如”YYYY-MM-DD”、”MM/DD/YYYY”、”DD.MM.YYY…

    python 2023年6月2日
    00
  • 详解pandas安装若干异常及解决方案总结

    下面是“详解Pandas安装若干异常及解决方案总结”的完整攻略。 一、前言 pandas是一个用于数据处理和分析的Python库,广泛应用于数据科学、人工智能和机器学习等领域。本文将详细说明在安装pandas时所可能出现的异常及其解决方案,帮助读者解决pandas的安装问题。 二、安装pandas时可能出现的异常 Command “python setup.…

    python 2023年5月13日
    00
  • python 层次聚类算法图文示例

    下面我将为您详细讲解“python 层次聚类算法图文示例”的完整攻略。 1.层次聚类算法 层次聚类算法是一种将相似数据点归为一类的无监督学习算法,它可以按照类似树这样的层次结构将数据点聚合成一个个簇。层次聚类算法的具体实现方式有两种:自下而上的聚合法和自上而下的分裂法。 在聚合法中,每个数据点最初都被看作一个簇,逐渐合并成大型簇,最终形成一个大的聚类树。而在…

    python 2023年6月5日
    00
  • python统计字母、空格、数字等字符个数的实例

    下面是“python统计字母、空格、数字等字符个数的实例”的完整攻略。 1. 分析需求 首先,我们需要分析需求,即统计字母、空格、数字等字符的个数。在Python中,可以通过字符串的方法来实现这个功能。我们需要遍历字符串中的每个字符,判断是字母、空格还是数字,并进行相应的计数。最终得到字母、空格、数字等字符的个数。 2. 编写代码 接下来,我们可以编写Pyt…

    python 2023年6月5日
    00
  • 复制粘贴功能的Python程序

    关于“复制粘贴功能的Python程序”的制作,我提供以下完整攻略。 1. 概述 首先,我们需要了解一下制作这个程序的基本思路。在Python中,实现复制粘贴功能的方法是通过使用pyperclip库。该库提供一些用于复制和粘贴剪贴板中文本的函数。基本上,我们需要做的就是使用这些函数,根据用户的输入在剪贴板中进行操作。 2. 安装pyperclip 我们需要先安…

    python 2023年6月3日
    00
  • 在Python的Django框架中用流响应生成CSV文件的教程

    下面是详细讲解在Python的Django框架中用流响应生成CSV文件的教程,包括两个示例。 1. 先介绍一下什么是CSV文件 CSV(Comma-Separated Values)是一种常见的文件格式,用于将表格数据导出为文本文件,以便在不同的程序和平台上进行处理。CSV文件通常由逗号、制表符或其他特定字符分隔单元格,每行表示一个记录或数据。 2. 用Dj…

    python 2023年5月20日
    00
  • Python3 导入上级目录中的模块实例

    下面为您详细讲解“Python3 导入上级目录中的模块实例”的完整攻略。 在Python中,想要从上级目录中导入模块实例,通常有以下几种方式: 方式一:使用sys.path.append() 在导入模块时,Python会按照一定的顺序搜索模块。其中,sys.path变量包含了Python搜索模块时所查找的路径。可以通过修改sys.path变量来实现从上级目录…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部