网络爬虫之12306-验证码验证
Posted 何老师的科技在线
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫之12306-验证码验证相关的知识,希望对你有一定的参考价值。
写在前面的话......
【参考文献】
本系列文章参考了黄永祥的《玩转Python网络爬虫》的第15章,在此表示感谢。
项目实战之12306抢票
Chapter 1-验证码验证
1-1 功能说明
根据购票流程,确定爬虫功能开发顺序。
1. 验证码验证
2. 用户登录与验证
3. 查询车票
4. 预定车票
5. 提交订单
6. 生成订单
1-2 验证码验证
1. 使用浏览器访问登录界面:https://kyfw.12306.cn/otn/login/init
2. 按下F12打开浏览器的开发者工具,
3. 填写登录名和密码,然后选择1个错误的验证码,然后点击“登录”。
4. 根据右下角的Form Data,寻找验证码的规律。
如选择第一个图片,
还是第一张图片,不过选择了2个位置,
实际上response(响应)是这样的:
发现没,login_site和rand都没有变化,只有answer在变化,这个answer代表着图标的坐标位置!因此,坐标位置不是唯一的,只要落在规定的区间即可。
如选择第2个图片时,
依次可以类推出其余6个图片的坐标值。
需要注意的是,目前针对这种坐标验证码,还没有很好的解决方案,只能通过人为输入正确的坐标位置来完成验证。
1-3 代码编写
import requests
#坐标参考:40,40,114,35,192,39,257,36,42,115,119,107,185,124,272,117
code_list = {
'1': '40,40,',
'2': '114,35,',
'3': '192,39,',
'4': '257,36,',
'5': '42,115,',
'6': '119,107,',
'7': '185,124,',
'8': '272,117'
}
# 创建会话,确保每次请求都在同一个会话中
session = requests.session()
# 请求头
headers = { 'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
'(Khtml, like Gecko) Chrome/63.0.3218.0 Safari/537.36',
'Referer':
'https://kyfw.12306.cn/otn/login/init'}
# 验证码图片的url
url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'
#忽略证书验证
r = session.get(url, headers=headers, verify=False)
#下载验证码图片
f = open('code.png','wb')
f.write(r.content)
f.close()
#输入验证码图片位置,多个验证码用英文逗号分开
code=input("请输入验证码:")
get_code = ''
for i in code.split(','):
# 根据输入每组图片的组号,获取对应的坐标位置
get_code += code_list[i]
#验证码校验
data={
'answer':get_code,
'login_site':'E',
'rand':'sjrand'
}
# 发起验证码的请求
url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
r = session.post(url, data=data)
print(r.text)
1-4 测试验证
输入正确验证码时:
2. 验证码漏选时:
3. 验证码选择错误时:
1-5 小结
验证码校对是买票的第一个环节,只有验证通过了才能进行之后的环节。本篇对验证码的一些基础内容进行了介绍与实践,并最后进行了测试验证,测试结果表明代码实现了预期功能。下一篇就是要介绍用户登录了。
以上是关于网络爬虫之12306-验证码验证的主要内容,如果未能解决你的问题,请参考以下文章
12306模拟登录验证码识别,Python资深大牛深度分析,纯干货!