本攻略将为您详细讲解如何使用Python实现自动登录12306并自动点击验证码完成登录。我们将分为以下几个步骤进行讲解:
- 分析登录流程和相关参数
- 使用requests库模拟登录
- 自动识别和点击验证码
- 完整示例代码及说明
1. 分析登录流程和相关参数
在使用Python模拟登录之前,我们需要了解登录流程和相关参数。对于12306来说,登录的流程大致如下:
- 访问登录页:https://kyfw.12306.cn/otn/login/init
- 获取登录页中的相关参数,包括:
- _jc_save_fromStation:出发地站点编码
- _jc_save_toStation:目的地站点编码
- _jc_save_fromDate:出发日期
- randCode:验证码(如果页面中有验证码的话)
- 提交登录请求,包含以下数据:
- loginUserDTO.user_name:用户名
- loginUserDTO.password:密码
- randCode:验证码(如果页面中有验证码的话)
- _json_att:空字符串
- 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技术站