欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 22:43:40
...

前言

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

请求分析

  1. 我们简单抓包就可以找到生成验证码的接口
    【2019.06.22】12306官网模拟登陆之验证码生成与验证初探
    去除一些暂时无关的参数(仅分析验证码)
    https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
    【2019.06.22】12306官网模拟登陆之验证码生成与验证初探
  2. 验证验证码是否正确的接口
    其中answer表示验证码的坐标位置
    answer: 34,34,38,105
    【2019.06.22】12306官网模拟登陆之验证码生成与验证初探

代码思路

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