Article / 文章中心

12306官网模拟登陆之验证码生成与验证初探

发布时间:2020-11-04 点击数:2805

来源:CSDN

前言

每一个学习过爬虫的人对12306肯定都是有点想法,但在每年春节或一些假期经历过12306官网抢票后,这些念头便逐渐不剩下多少了。有时候真的是活生生的人都瞅不出来
一直没有勇气去分析一下12306官网

请求分析

  1. 我们简单抓包就可以找到生成验证码的接口
    在这里插入图片描述
    去除一些暂时无关的参数(仅分析验证码)
    https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
    在这里插入图片描述
  2. 验证验证码是否正确的接口
    其中answer表示验证码的坐标位置
    answer: 34,34,38,105
    在这里插入图片描述

代码思路

import requests


headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36'
}

login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
session = requests.Session()
session.get(login_url)

image_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'
req = session.get(image_url, headers=headers).content
with open('code.png', 'wb') as f:
    f.write(req)
    
check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'


point_dict = {
    '1': '37,40',
    '2': '112,40',
    '3': '187,40',
    '4': '262,40',
    '5': '37,120',
    '6': '112,120',
    '7': '187,120',
    '8': '262,120',
}
def get_point(indexs):
    indexs = indexs.split(',')
    temp = []
    for index in indexs:
        temp.append(point_dict[index])
    return ','.join(temp)

params = {
'answer': get_point(input('请输入验证码位置')),
'rand':'sjrand',
'login_site':'E',
}
response = session.get(check_url, params=params, headers=headers).text
print(response)

分析

12036 验证码 问题就在如何确认应该点击的坐标位置,目前还没有发现合适的做法,不知道有哪位大佬可以指点一下,有了解的大码平台也可以推荐一下。