项目需求分析
整个项目应实现:浏览器自动登录12306网站,查询余票,车票预订,到自动提交系统支付的功能。
具体包括:登录界面的cookie处理(保持登录界面)、登录时的验证码处理、余票查询、提交订单等部分。
分析:
借助工具fiddler,作为整个数据传输的记录环节。整个登录环节包括六个部分的验证才能实现。
用到的模块:
urllib.request:获取网页
re:正则
ssl:提供https支持
urllib.parse.urlencode:数据转换
http.cookiejar:cookie处理
datetime:日期函数
time:可作时间延迟
登录模块
cookie处理:
为保持登录界面的,需要提前进行cookie处理。
功能实现:
#建立cookie处理
print('cookie 处理中')
cjar=http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) #先声明使用cookiejar对象,再建立opener
urllib.request.install_opener(opener) #将opener安装为全局
1.验证码处理
关键点:
如何进行验证码的识别?通过fiddler抓包分析可推出:验证码的每张图片都代表着一个"坐标值",并且每个坐标在一定的范围内变动。
验证码网址:
https://kyfw.12306.cn/passport/captcha/captcha-check
此过程进行的是Post请求,下面是需要提交的"报表数据":
answer :123,124
login_site:E
rand:sjrand
功能实现:
#验证码处理并验证
#验证码网址
yzmurl='https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'
#验证码的处理,避免验证码出错,再次输入
while True:
urllib.request.urlretrieve(yzmurl,'D:/爬虫工程师/yzm.png')
yzm=input('请输入验证码,输入第几张图片即可')
if (yzm!='regain'):
break
#输入图片坐标位置格式:'1','2','3','4','5'
#验证码图片处理,图片序号转坐标
pat1='"(.*?)"' #提取数字
allpic=re.compile(pat1).findall(yzm) #匹配所有图片数字位置
#定义数字转坐标函数
def getxy(pic):
if(pic==1):
xy=(30,40) #横纵坐标在一定范围内变动,不是固定不变的
if(pic==2):
xy=(110,45)
if(pic==3):
xy=(190,45)
if(pic==4):
xy=(250,42)
if(pic==5):
xy=(36,110)
if(pic==6):
xy=(112,120)
if(pic==7):
xy=(190,120)
if(pic==8