【2019.06.22】12306官网模拟登陆之验证码生成与验证初探
程序员文章站
2024-03-17 22:43:40
...
前言
每一个学习过爬虫的人对12306肯定都是有点想法,但在每年春节或一些假期经历过12306官网抢票后,这些念头便逐渐不剩下多少了。有时候真的是活生生的人都瞅不出来
一直没有勇气去分析一下12306官网
请求分析
- 我们简单抓包就可以找到生成验证码的接口
去除一些暂时无关的参数(仅分析验证码)https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
- 验证验证码是否正确的接口
其中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 验证码 问题就在如何确认应该点击的坐标位置,目前还没有发现合适的做法,不知道有哪位大佬可以指点一下,有了解的大码平台也可以推荐一下。