Python-requests-12306-登陆
好久没有更新了,今天周一困得要命,更新篇文章提提神。
本来想用requests写个12306购票,但是感觉写起来会很长,想想还是分开写好点
想想把12306分为2部分:
1.登陆
2.购票
首先,我们先来看下12306网站
问题1:网站连接不安全 可能要跳过ssl验证
问题2:登陆时的验证码问题
然后,我们来手动真正的登陆一次12306 看看登陆时需要提交哪些data
通过chrome浏览器抓包后能发现一共需要3个参数
1)username: 你的账号
2)password:你的密码
3)appid:otn但是我们没发现任何关于验证码有关的参数,可见是在我们登陆之前网站就提前验证了我们提交的验证码参数
在login上面有个captcha_check应该就是验证码的验证,我们来看下
也是3个参数
1)answer:就是你登陆时选择的答案的对应的坐标
2)login_site:E
3)rand:sjrand这里我介绍两种方法破解这个验证码:
A)手动输入
B)打码平台:超级鹰先来说下手动输入的这种方法,这种方法就需要我们去测试这个坐标怎么得来的。
先来看下我登陆时验证的验证码图片
找出图片中的仪表盘和中国结
提交的正确坐标有3个都用逗号隔开
32,42,256,46,35,122
我们来测试下看看这3个坐标都是哪里
我们以图中箭头标记处为起点 范围为图片部分
分别来看下这3个坐标(微信的ALT+A 或者QQ的CTRL+ALT+A截图)
1)32,42
2)256,46
3)35,122
不用说大家也都明白了,坐标该怎么得到了,而且答案也不是唯一的
按照格式提交就OK了 每个数字用逗号隔开32,42,256,46,35,122B)第二种方法我这里使用超级鹰打码平台,说实话,我写代码测试的时候这个打码平台,简直没法说,准确率太低…(http://www.chaojiying.com)
大家去超级鹰官网上去下载python的对应文件然后进行修改就OK了 这里不再介绍打码平台的配置,直接贴上代码
#!/usr/bin/env python
# coding:utf-8import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):#平台账号self.username = username#平台密码self.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()
我们只需要把验证码图片传到平台对应链接就OK
他会返回一个json数据
{‘err_no’: 0, ‘err_str’: ‘OK’, ‘pic_id’: ‘6032817371507400001’, ‘pic_str’: ‘107,92’, ‘md5’:‘2797d0254014d9a136cabf4888fdf380’}
我们要提交的参数就是pic_str 取它的值就OK 坐标多的情况下,每个坐标之间是用 | 隔开的我们replace为逗号即可。接下来我们就用打码平台得到参数然后登陆12306
在这之前我们先整理下思路:
1)下载验证码图片
https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand
2)把图片提交到打码平台
3)返回坐标
4)构造登陆参数,进行登陆
https://kyfw.12306.cn/passport/web/login不罗嗦 直接上代码
# -*- coding: utf-8 -*-
import json
import re
import time
import requests
import logging
logging.captureWarnings(True)
#my_txt我的账号密码等信息文件
from ticket_12306.my_txt import *
from urllib.parse import unquote
#验证码平台文件
from chaojiying.chaojiying_Python.chaojiying import Chaojiying_Clientclass order_ticket_12306:def __init__(self):#创建session会话self.sess = requests.Session()#跳过ssl验证self.sess.verify = False#验证码图片地址self.captcha_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand'#验证码图片存储路径self.captcha_file_path = 'captcha.jpg'#打码平台self.chaojiying = Chaojiying_Client(chaojiying_user, chaojiying_passwd, '96001')def captcha_download(self):'''下载验证码图片:return: '''with open(self.captcha_file_path, 'wb') as f:image = self.sess.get(self.captcha_url)if image.status_code == 200:f.write(image.content)else:print('验证码下载失败, 正在重试...')self.captcha_download()def get_captcha(self):'''提交图片到打码平台,获取坐标:return: '''self.captcha_download()im = open(self.captcha_file_path, 'rb').read()print('chaojiying111111111',self.chaojiying.PostPic(im, 9004))res = self.chaojiying.PostPic(im, 9004)return resdef captcha_check(self):'''提交答案,进行验证会返回一个json数据里面有result_code如果result_code==4的话为成功,否则进行重新验证:return: '''captcha_res = self.get_captcha()captcha_code = captcha_res.get('pic_str').replace('|', ',')check_data = {'answer': captcha_code,'login_site': 'E','rand': 'sjrand',}check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'res = self.sess.post(check_url, data=check_data).textprint(res)check_result = str(json.loads(res).get('result_code'))print(check_result)if check_result!='4':print('验证码校验失败, 正在重试...')try:print('验证码验证报错....')pic_id = captcha_res.get('pic_id')#报错到打码平台self.chaojiying.ReportError(pic_id)except:print('验证码验证报错失败...')self.captcha_check()print(11111, res)def login(self):'''12306登陆:return: '''login_headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','X-Requested-With': 'XMLHttpRequest'}login_data = {'username': user_12306,'password': passwd_12306,'appid': 'otn'}login_url = 'https://kyfw.12306.cn/passport/web/login'res = self.sess.post(login_url, data=login_data, headers = login_headers).textprint(22222, res)return res
- OK我们再来登陆一次
- 登陆成功…
#总结:
12306更新的频率很快,动不动就改动一些地方,其实这个12306我2个礼拜前写过一次,今天运行时候就各种报错,重新抓包对比了一下,发现所有的URL全都修改了!!!=–
所以 我这代码可能过段时间就又用不了了 ,主要过程。最后,登陆后购票的部分,会写到下篇文章,《Python-requests-12306-购票》
Python-requests-12306-登陆相关推荐
- Python + Requests 模拟登陆(含验证码)
其实模拟登陆非常简单,只要在打开网站的同时提交数据就可以了. 下面通过登陆超星网来举例说明如何一步步实现模拟登陆. 1.获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易 ...
- 使用python爬虫模拟12306登陆
使用python爬虫模拟12306登陆 需要用到requests库函数,下载requests库函数地方法:直接在命令行输入以下代码就可以了就可以了. pip install requests 模拟 ...
- python编写12306窗体抢票软件(二)
python编写12306窗体抢票软件(二) 本文这次介绍如何获取12306网站的验证码并登陆. 1 获取验证码 12306它是一个服务器,每次我们访问它都是以客户端的方式去向它索取信息. 建议用谷歌 ...
- 快过年了,Python实现12306查票以及自动购票....
嗨害大家好鸭!我是小熊猫~ 明天就是2023年啦~ 还有谁像我小熊猫一样没有回家的? 这次康康能不能12306抢票回家!!! Python实现12306查票以及自动购票 [代码来源]: 青灯教育-自游 ...
- python爬虫——12306查询车次
python爬虫--12306查询车次 使用抓包工具 中文地名转地名参数代码 使用12306提供的查询api进行查询 实现完整代码 使用抓包工具 首先登陆12306 点击查询:同时使用network抓 ...
- 如何利用Python破解12306验证码和浏览车次为例!你学会了吗?
本节重点讲的是python爬虫中的session和cookie在爬虫中的应用,所以12306验证码的破解可能相比手工操作更麻烦,但未来会讲解更容易的验证码破解和12306登陆~ cookie和sess ...
- python实现12306余票
今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的 ...
- python requests的作用_requests session的作用
requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该sessi ...
- 用python写12306系统_Python实现12306火车票抢票系统
Python实现12306火车票抢票系统 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: Python实现12306火车票抢票系统.txt ] (友情提示:右键点 ...
- python识别12306验证码_Python 识别12306图片验证码物品的实现示例
1.PIL介绍以及图片分割 Python 3 安装: pip3 install Pillow 1.1 image 模块 Image模块是在Python PIL图像处理中常见的模块,主要是用于对这个图 ...
最新文章
- idea Debug快捷键
- win 2008 控制共享文件夹大小_win10如何一键网络共享
- Mysql Oracle 工具推荐
- 玩转嵌入式,且看痞子衡
- Kafka是如何处理Netflix每天2万亿条消息的?
- 被尘封的故事鸿蒙轩,被尘封的故事全任务通关人物存档
- (3)Linux进程调度-进程切换
- 安装 mysql 数据库, 并做 主 从(二)
- [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
- RFC4568规范:SDP协商SRTP密钥
- 人工智能:python 实现 第十章,NLP 第一天 入门介绍及使用stemming还原词汇
- Ubuntu 16 NFS的安装与使用
- Excel快速下拉填充序列至10000行
- 计算机DNS怎么配置,如何设置电脑的dns地址
- snes9x 源码_仅64kb的SNES游戏如何制作优美的音乐
- SwiftUI 色彩教程之 01什么是色差Color difference
- 大数据工程师和数据分析师有何区别
- 微信头像更新了,有你喜欢的吗?
- ipad pro无法连接wifi终极解决方法
- 树莓派 配置USB麦克风声卡