网络爬虫之12306-验证码验证

Posted 何老师的科技在线

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫之12306-验证码验证相关的知识,希望对你有一定的参考价值。

写在前面的话......

【参考文献】

本系列文章参考了黄永祥的《玩转Python网络爬虫》的第15章,在此表示感谢网络爬虫之12306-验证码验证

项目实战之12306抢票

Chapter 1-验证码验证

1-1 功能说明

根据购票流程,确定爬虫功能开发顺序。

1. 验证码验证

2. 用户登录与验证

3. 查询车票

4. 预定车票

5. 提交订单

6. 生成订单

 

1-2 验证码验证

1. 使用浏览器访问登录界面:https://kyfw.12306.cn/otn/login/init

2. 按下F12打开浏览器的开发者工具,


网络爬虫之12306-验证码验证


3. 填写登录名和密码,然后选择1错误的验证码,然后点击“登录”。

4. 根据右下角的Form Data,寻找验证码的规律。

如选择第一个图片,


网络爬虫之12306-验证码验证


还是第一张图片,不过选择了2个位置,


网络爬虫之12306-验证码验证


实际上response(响应)是这样的:


网络爬虫之12306-验证码验证


发现没,login_siterand都没有变化,只有answer在变化,这个answer代表着图标的坐标位置!因此,坐标位置不是唯一的,只要落在规定的区间即可。

如选择第2个图片时,


网络爬虫之12306-验证码验证


依次可以类推出其余6个图片的坐标值。

网络爬虫之12306-验证码验证


需要注意的是,目前针对这种坐标验证码,还没有很好的解决方案,只能通过人为输入正确的坐标位置来完成验证。

 

1-3 代码编写

import requests
#坐标参考:40,40,114,35,192,39,257,36,42,115,119,107,185,124,272,117code_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'}
# 验证码图片的urlurl = '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 测试验证

  1. 输入正确验证码时:


网络爬虫之12306-验证码验证


2. 验证码漏选时:



3. 验证码选择错误时:



1-5 小结

验证码校对是买票的第一个环节,只有验证通过了才能进行之后的环节。本篇对验证码的一些基础内容进行了介绍与实践,并最后进行了测试验证,测试结果表明代码实现了预期功能。下一篇就是要介绍用户登录了。


以上是关于网络爬虫之12306-验证码验证的主要内容,如果未能解决你的问题,请参考以下文章

12306模拟登录验证码识别,Python资深大牛深度分析,纯干货!

鲸数云爬虫门槛之验证码识别

python网络爬虫之如何识别验证码

Python3网络爬虫实战-44点触点选验证码的识别

爬虫学习笔记(十八)—— 点触验证码:超级鹰12306自动登录

python爬虫之:模拟12306登录