一、 实现需求
1、 登录12306
用户名与密码是明码登录,无需处理
2、 动态图片验证码
是8张动态图片,图片很小
可能要选择图片中的1—3个不等图片
3、 查票与购票
要定位到登录url,及要提交的参数
二、 实现原理
1、 采用session技术
尽管cookie与session本质上是一回事,但不能混用,要么采用cookie,要么采用session
2、 采用PIL处理图片
response下载字节保存到本地图片文件,用PIL显示图片
3、 12306验证码图片
1) 是一张图片,要找出其中的1—3张图片
2) 这张图片中有8张小图片
分2排
上一排序号为0,1,2,3,
下一排序号为4,5,6,7
3) 这8张小图片相对中心坐标
[‘35,35’,’105,35’,’175,35’,’245,35’,’35,105’,’105,105’,’175,105’,’245,105’]
4) 假设要提交第2,4,6张图片,则提交数据为
175,35,35,105,175,105
分别对应第2,4,6图片坐标位置
4、 登录
同一个session验证通过后,即可以登录
三、 完整示例如下
# -*- coding: utf-8 -*-
"""
2018-06-22 15:49:34
作者:刘明
"""
import requests
from PIL import Image
from json import loads
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
}
session = requests.session()
def getCheckImgIndex():
url = "https://kyfw.12306.cn/passport/captcha/captcha