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

本攻略将为您详细讲解如何使用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中,我们可以使用正则表达式来搜索单词。本文将详细讲解Python利用正则表达式搜索单词的方法,以及如何在实际开发中应用。 二、解决方案 2.1 搜索单词的方法 在Python中,搜索单词的方法可以使用正则表达式来实现。我们可以使用re模块中的findall()函数来…

    python 2023年5月14日
    00
  • 使用python批量转换文件编码为UTF-8的实现

    使用Python进行批量文件编码转换为UTF-8是一项常见的操作,下面将详细介绍如何实现这一过程: 1. 安装必要的Python库 为了执行文件编码转换,我们需要使用Python中的chardet、os、codecs和argparse库。安装这些库可以使用pip命令: pip install chardet pip install argparse 2. 编…

    python 2023年5月31日
    00
  • Python闭包实现计数器的方法

    Python 闭包是函数式编程的重要概念,其能够返回一个函数并保留该函数所需的环境变量。利用 Python 闭包的特性,我们可以实现一种方便实用的计数器。 实现方法 一个简单的计数器可以使用 Python 的全局变量来实现,例如: count = 0 def counter(): global count count += 1 return count 这种…

    python 2023年5月19日
    00
  • python [:3] 实现提取数组中的数

    要实现提取数组中的数,我们可以使用Python中的切片(Slice)操作。切片可以用于对Python中的列表(List)、元组(Tuple)和字符串(String)等序列对象进行切片操作。它的语法基本形式是: Slice[start:end:step] 其中,Slice是需要进行切片的序列对象,start为开始切片的位置(默认为0),end为结束切片的位置(…

    python 2023年6月5日
    00
  • 浅谈spring boot 集成 log4j 解决与logback冲突的问题

    下面是“浅谈Spring Boot集成Log4j解决与Logback冲突的问题”的完整攻略。 1. 背景介绍 在使用Spring Boot进行项目开发时,会涉及到日志输出的问题。Spring Boot默认使用Logback作为日志框架,但是有的时候我们会想使用其他日志框架,比如Log4j。然而,由于Logback和Log4j都使用了SLF4J作为他们的日志框…

    python 2023年6月3日
    00
  • Python计算时间间隔(精确到微妙)的代码实例

    下面是“Python计算时间间隔(精确到微妙)的代码实例”的完整攻略。 1. 时间间隔计算的原理 在Python中,可以通过datetime模块来计算时间间隔(精确到微妙)。该模块提供了一个datetime类,可以用来表示日期和时间,同时也提供了一个timedelta类,可以用来表示时间间隔。 通过将两个datetime对象相减,可以得到一个timedelt…

    python 2023年6月2日
    00
  • python写入中英文字符串到文件的方法

    当我们需要把字符串写入文件中保存时,我们可以利用 Python 内置的文件操作来实现,其中需要注意一些细节问题。 1. 打开文件 在文件操作中,首先需要打开文件。要打开文件,我们需要使用 Python 内置的 open() 函数,该函数有两个参数:文件路径和打开模式。 其中,文件路径指需要打开的文件所在的路径和文件名;打开模式指打开文件的方式,有读取、写入、…

    python 2023年5月20日
    00
  • 在Python的struct模块中进行数据格式转换的方法

    Python的struct模块是用于在C和Python数据类型之间进行转换的模块。该模块允许你在二进制数据和Python数据类型之间进行相互转换。 1. 使用struct模块进行数据格式转换的方法 下面是使用Python的struct模块进行数据格式转换的方法: 1.1 将Python数据转换为二进制数据 首先,你可以使用struct模块的pack方法来将P…

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