python自动登录12306并自动点击验证码完成登录的实现源代码

yizhihongxing

本攻略将为您详细讲解如何使用Python实现自动登录12306并自动点击验证码完成登录。我们将分为以下几个步骤进行讲解:

  1. 分析登录流程和相关参数
  2. 使用requests库模拟登录
  3. 自动识别和点击验证码
  4. 完整示例代码及说明

1. 分析登录流程和相关参数

在使用Python模拟登录之前,我们需要了解登录流程和相关参数。对于12306来说,登录的流程大致如下:

  1. 访问登录页:https://kyfw.12306.cn/otn/login/init
  2. 获取登录页中的相关参数,包括:
  3. _jc_save_fromStation:出发地站点编码
  4. _jc_save_toStation:目的地站点编码
  5. _jc_save_fromDate:出发日期
  6. randCode:验证码(如果页面中有验证码的话)
  7. 提交登录请求,包含以下数据:
  8. loginUserDTO.user_name:用户名
  9. loginUserDTO.password:密码
  10. randCode:验证码(如果页面中有验证码的话)
  11. _json_att:空字符串
  12. submit:登录按钮

2. 使用requests库模拟登录

我们将使用requests库来模拟登录。首先,我们需要使用requests.get()方法获取登录页面。可以将登录页面保存到本地文件进行分析,或者直接使用BeautifulSoup库进行解析。

import requests
from bs4 import BeautifulSoup

# 获取登录页面
login_url = 'https://kyfw.12306.cn/otn/login/init'
response = requests.get(login_url)

# 解析登录页面
soup = BeautifulSoup(response.text, 'html.parser')

接下来,我们需要获取登录页面中的相关参数。这些参数可以通过BeautifulSoup库进行解析:

# 获取相关参数
from_station_input = soup.find('input', {'id': 'fromStation'})
to_station_input = soup.find('input', {'id': 'toStation'})
from_date_input = soup.find('input', {'id': 'train_date'})
rand_code_img = soup.find('img', {'id': 'img_rand_code'})

from_station_param = from_station_input['value']
to_station_param = to_station_input['value']
from_date_param = from_date_input['value']
rand_code_url = rand_code_img['src']

现在,我们已经获得了登录页面中的相关参数。我们可以使用requests.post()方法模拟登录:

# 模拟登录
login_api_url = 'https://kyfw.12306.cn/passport/web/login'
login_data = {
    'username': 'your_username',
    'password': 'your_password',
    'appid': 'otn',
    'answer': ''
}
if rand_code_url:
    # 如果有验证码,则识别并提交
    rand_code_response = requests.get(rand_code_url)
    rand_code = recognize_code(rand_code_response.content)
    login_data['answer'] = rand_code

response = requests.post(login_api_url, data=login_data)
if response.json()['result_code'] != 0:
    # 登录失败
    print('登录失败')
else:
    # 登录成功
    print('登录成功')

3. 自动识别和点击验证码

如果登录页面中存在验证码,那么我们就需要自动识别和点击验证码才能完成登录。这里我们采用tesseract-ocr来识别验证码,使用PIL库来处理验证码图片。

import pytesseract
from PIL import Image

# 识别验证码
def recognize_code(img):
    # 对图片进行处理,去除噪点并二值化
    img = Image.frombytes('RGB', (75, 24), img, 'raw')
    img = img.convert('L').point(lambda x: 255 if x<128 else 0)

    # 识别图片
    result = pytesseract.image_to_string(img, lang='eng', config='--psm 7')
    return result.strip()

最后,我们需要自动点击验证码才能完成登录。这里我们使用pyautogui库来模拟鼠标点击。

import pyautogui

# 点击验证码
def click_code():
    # 获取验证码图像位置
    code_element = driver.find_element_by_id('img_rand_code')
    code_location = code_element.location
    code_size = code_element.size

    # 计算验证码坐标
    x = code_location['x'] + code_size['width'] / 2
    y = code_location['y'] + code_size['height'] / 2

    # 模拟鼠标点击
    pyautogui.click(x, y)

4. 完整示例代码及说明

下面是一个完整的示例代码,其中包括:获取登录页面、模拟登录、自动识别和点击验证码等所有步骤。代码中的具体操作已经有详细的注释,可以根据注释进行理解。

import requests
from bs4 import BeautifulSoup
import pytesseract
from PIL import Image
import pyautogui

# 识别验证码
def recognize_code(img):
    # 对图片进行处理,去除噪点并二值化
    img = Image.frombytes('RGB', (75, 24), img, 'raw')
    img = img.convert('L').point(lambda x: 255 if x<128 else 0)

    # 识别图片
    result = pytesseract.image_to_string(img, lang='eng', config='--psm 7')
    return result.strip()

# 点击验证码
def click_code():
    # 获取验证码图像位置
    code_element = driver.find_element_by_id('img_rand_code')
    code_location = code_element.location
    code_size = code_element.size

    # 计算验证码坐标
    x = code_location['x'] + code_size['width'] / 2
    y = code_location['y'] + code_size['height'] / 2

    # 模拟鼠标点击
    pyautogui.click(x, y)

# 获取登录页面
login_url = 'https://kyfw.12306.cn/otn/login/init'
response = requests.get(login_url)

# 解析登录页面
soup = BeautifulSoup(response.text, 'html.parser')

# 获取相关参数
from_station_input = soup.find('input', {'id': 'fromStation'})
to_station_input = soup.find('input', {'id': 'toStation'})
from_date_input = soup.find('input', {'id': 'train_date'})
rand_code_img = soup.find('img', {'id': 'img_rand_code'})

from_station_param = from_station_input['value']
to_station_param = to_station_input['value']
from_date_param = from_date_input['value']
rand_code_url = rand_code_img['src']

# 模拟登录
login_api_url = 'https://kyfw.12306.cn/passport/web/login'
login_data = {
    'username': 'your_username',
    'password': 'your_password',
    'appid': 'otn',
    'answer': ''
}
if rand_code_url:
    # 如果有验证码,则识别并提交
    rand_code_response = requests.get(rand_code_url)
    rand_code = recognize_code(rand_code_response.content)
    login_data['answer'] = rand_code

response = requests.post(login_api_url, data=login_data)
if response.json()['result_code'] != 0:
    # 登录失败
    print('登录失败')
else:
    # 登录成功
    print('登录成功')

接下来,我们以一个示例来展示如何使用以上代码自动登录12306。

示例一:登录成功

假设我们的12306账号密码已经正确,此时我们使用以上代码进行模拟登录,将会输出“登录成功”。

示例二:登录失败

假设我们的12306账号密码错误,此时我们使用以上代码进行模拟登录,将会输出“登录失败”。

总之,我们可以通过以上示例代码和详细讲解,很轻松地实现Python自动登录12306并自动点击验证码完成登录的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python自动登录12306并自动点击验证码完成登录的实现源代码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python图像处理之图像金字塔的向上和向下取样

    Python图像处理之图像金字塔的向上和向下取样 图像金字塔是一种通过对同一幅图像进行不同分辨率的缩放而得到的一系列图像集合,可以用于图像处理中的多尺度分析和特征提取等。其中向上取样和向下取样是图像金字塔处理中常用的两个方法,下面我们将详细讲解它们的原理和使用方法。 向下取样 向下取样可以理解为将原始图像放大一倍,再把每一对相邻的像素缩减为一个像素,因此它也…

    python 2023年5月14日
    00
  • python实现矩阵和array数组之间的转换

    首先需要导入Numpy库: import numpy as np 接下来我们将介绍在Python中如何实现矩阵和Numpy数组之间的转换。 矩阵转换为Numpy数组 我们可以使用以下代码从矩阵中创建一个Numpy数组: my_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] my_array = np.array(my_m…

    python 2023年6月5日
    00
  • Python列表删除的三种方法代码分享

    以下是“Python列表删除的三种方法代码分享”的完整攻略。 1. 使用del语句 在Python中,我们可以使用del语句删除列表中元素。del语可以删除列表中指定位置的元素,也可以删除整个列表。以下是del语句的语法: del list[index] 其中list是要进行删除操作的列表,index是要删除的元素的位置。以下是一个示例,演示如何使用del语…

    python 2023年5月13日
    00
  • python sys.argv[]用法实例详解

    当我们在终端运行Python程序时,可以给程序传递一些参数,这些参数可以在程序中被获取和使用。Python提供了sys模块来获取命令行参数,其中sys.argv就是其中比较重要的一个属性。 sys.argv是一个列表,列表里的元素是命令行参数,其中第一个元素是该程序的文件名。在Python程序中,可以通过数组下标来获取对应的命令行参数。当然在实际使用时,我们…

    python 2023年6月2日
    00
  • python3 正则表达式基础廖雪峰

    Python3正则表达式基础 正则表达式是一种用于描述字符串模式的语言,可以用于配、查找、替换和分割。在Python中,可以使用re模块来使用正则表达式。本文将详细介绍Python中正则表达式的语法、字符集、转义字符以及常用函数,并提供两个示例说明。 基本语法 正则表达式由普通字符和元成,普字符表示本身,而元字符则有特殊的含义。下面是一些常用元字符: .:匹…

    python 2023年5月14日
    00
  • 手动安装python3.6的操作过程详解

    让我来详细讲解一下“手动安装Python3.6的操作过程详解”: 准备工作 在开始手动安装Python3.6之前,我们需要先下载Python3.6的压缩包并解压缩。可以在Python官网的 下载页面 下载对应的版本。这里以Python3.6.9为例: wget https://www.python.org/ftp/python/3.6.9/Python-3.…

    python 2023年5月14日
    00
  • Python配置文件管理之ini和yaml文件读取的实现

    Python是一种非常流行的编程语言,它支持通过INI和YAML格式的配置文件来管理应用程序的参数和选项。在本文中,我将分享如何使用Python来读取INI和YAML配置文件的实现方法。 1. 什么是INI文件? INI(Initial)文件是一种常见的配置文件格式,它用于存储各种类型的配置文件,如Windows配置文件和Unix配置文件。一个典型的INI文…

    python 2023年6月3日
    00
  • Python 两个列表的差集、并集和交集实现代码

    差集、并集和交集是Python中常用的操作,可以使用set()函数实现。下面是Python两个列表的差集、并集和交集实现代码的完整攻略。 差集 两个列表的差集是指在第一个列表中出现但在第二个列表中没有出现的元素。可以使用set()函数现两个列表的差集。以下是一个示例,演示如何使用set()函数实现两个列表的差集: # 定义两个列表 list1 = [1, 2…

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