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中做指数和对数的曲线拟合的完整攻略。 1. 准备数据 首先,我们需要准备需要拟合的数据,例如指数和对数函数示例代码: import numpy as np x = np.array([0, 1, 2, 3, 4, 5]) y1 = np.exp(x) y2 = np.log(x + 1) 2. 导入库 其次,我们需要导入所需的库,例如…

    python-answer 2023年3月25日
    00
  • Python中的Pandas 时间函数 time 、datetime 模块和时间处理基础讲解

    Python中的Pandas 时间函数 time、datetime 模块和时间处理基础讲解 在Python中,有很多内置函数和模块能够处理与时间相关的数据。本文将讲解Pandas中的time和datetime模块以及时间处理的基础知识。 时间戳 时间戳以1970年1月1日午夜(格林尼治标准时间)起始的秒数表示一个特定的时间点。在Python中,时间戳可以用t…

    python 2023年5月14日
    00
  • 如何使用Python进行Web开发?

    使用Python进行Web开发的步骤可以分为以下几个部分: 1.选择Web框架:Web框架是用于简化Web开发的工具,Python有很多优秀的Web框架可以选择,如Django、Flask、Tornado等。 2.安装Web框架:选择适合自己的Web框架后,需要安装对应的框架包。可以使用类似pip的包管理器进行安装。 3.创建Web应用程序:创建自己的Web…

    python 2023年4月19日
    00
  • Python使用Numpy实现Kmeans算法的步骤详解

    Python使用Numpy实现Kmeans算法的步骤详解 什么是Kmeans算法 Kmeans算法是一种常见的聚类算法,其目的是将一组数据划分成为K个类别。其基本思想是:首先随机选取K个聚类中心,然后将数据点划分到距离最近的聚类中心所在的类别中,再根据每个类别中的数据点重新计算聚类中心,重复执行这个过程,直到聚类中心的位置不再发生变化或达到一定的迭代次数。 …

    python 2023年5月14日
    00
  • Python实现图片添加文字

    下面是Python实现图片添加文字的完整攻略: 1. 准备工具和环境 首先,我们需要确保电脑中有Python环境和ImageMagick工具。可以在终端中通过以下命令检查: python –version convert -version 如果命令行输出了相应版本的信息,那么就说明已经具备了必要的工具和环境。 2. 使用Python库Pillow打开图片 …

    python 2023年6月6日
    00
  • Python实现超快窗口截图功能详解

    Python实现超快窗口截图功能详解 介绍 在Python中,我们可以利用Pillow库实现窗口截图功能。在此基础上,通过对图像进行处理,可以实现更多的功能。 准备工作 在开始之前,建议先安装Pillow库。打开命令行窗口,输入以下命令: pip install Pillow 窗口截图 首先,我们来实现窗口截图功能。这个功能非常简单,只需要用到Pillow库…

    python 2023年6月3日
    00
  • 在Mac OS系统上安装Python的Pillow库的教程

    下面是在Mac OS系统上安装Python的Pillow库的完整攻略: 步骤一:安装pip Pillow库依赖于pip包管理系统,因此首先需要在Mac OS系统上安装pip。在终端中输入以下命令: sudo easy_install pip 输入您的管理员密码(在系统提示之后),然后等待安装完成。 步骤二:安装Pillow 在终端中输入以下命令: pip i…

    python 2023年6月2日
    00
  • Python的三个重要函数详解

    关于“Python的三个重要函数详解”,我可以为你提供以下攻略: Python的三个重要函数详解 1. range函数 range函数是Python内置的一个函数,用于生成一个整数序列。这个函数最常用的的三个参数为range(start, stop, step),分别表示起始值、结束值和步长。其中,start是可选参数,如果不指定则默认为0;step也是可选…

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