好久没有更新了,今天周一困得要命,更新篇文章提提神。
本来想用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,122

  • B)第二种方法我这里使用超级鹰打码平台,说实话,我写代码测试的时候这个打码平台,简直没法说,准确率太低…(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-登陆相关推荐

  1. Python + Requests 模拟登陆(含验证码)

    其实模拟登陆非常简单,只要在打开网站的同时提交数据就可以了. 下面通过登陆超星网来举例说明如何一步步实现模拟登陆. 1.获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易 ...

  2. 使用python爬虫模拟12306登陆

    使用python爬虫模拟12306登陆   需要用到requests库函数,下载requests库函数地方法:直接在命令行输入以下代码就可以了就可以了. pip install requests 模拟 ...

  3. python编写12306窗体抢票软件(二)

    python编写12306窗体抢票软件(二) 本文这次介绍如何获取12306网站的验证码并登陆. 1 获取验证码 12306它是一个服务器,每次我们访问它都是以客户端的方式去向它索取信息. 建议用谷歌 ...

  4. 快过年了,Python实现12306查票以及自动购票....

    嗨害大家好鸭!我是小熊猫~ 明天就是2023年啦~ 还有谁像我小熊猫一样没有回家的? 这次康康能不能12306抢票回家!!! Python实现12306查票以及自动购票 [代码来源]: 青灯教育-自游 ...

  5. python爬虫——12306查询车次

    python爬虫--12306查询车次 使用抓包工具 中文地名转地名参数代码 使用12306提供的查询api进行查询 实现完整代码 使用抓包工具 首先登陆12306 点击查询:同时使用network抓 ...

  6. 如何利用Python破解12306验证码和浏览车次为例!你学会了吗?

    本节重点讲的是python爬虫中的session和cookie在爬虫中的应用,所以12306验证码的破解可能相比手工操作更麻烦,但未来会讲解更容易的验证码破解和12306登陆~ cookie和sess ...

  7. python实现12306余票

    今天就和大家一起来讨论一下python实现12306余票查询(pycharm+python3.7),一起来感受一下python爬虫的简单实践 我们说先在浏览器中打开开发者工具(F12),尝试一次余票的 ...

  8. python requests的作用_requests session的作用

    requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该sessi ...

  9. 用python写12306系统_Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  Python实现12306火车票抢票系统.txt ] (友情提示:右键点 ...

  10. python识别12306验证码_Python 识别12306图片验证码物品的实现示例

    1.PIL介绍以及图片分割 Python 3 安装:  pip3 install Pillow 1.1 image 模块 Image模块是在Python PIL图像处理中常见的模块,主要是用于对这个图 ...

最新文章

  1. idea Debug快捷键
  2. win 2008 控制共享文件夹大小_win10如何一键网络共享
  3. Mysql Oracle 工具推荐
  4. 玩转嵌入式,且看痞子衡
  5. Kafka是如何处理Netflix每天2万亿条消息的?
  6. 被尘封的故事鸿蒙轩,被尘封的故事全任务通关人物存档
  7. (3)Linux进程调度-进程切换
  8. 安装 mysql 数据库, 并做 主 从(二)
  9. [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
  10. RFC4568规范:SDP协商SRTP密钥
  11. 人工智能:python 实现 第十章,NLP 第一天 入门介绍及使用stemming还原词汇
  12. Ubuntu 16 NFS的安装与使用
  13. Excel快速下拉填充序列至10000行
  14. 计算机DNS怎么配置,如何设置电脑的dns地址
  15. snes9x 源码_仅64kb的SNES游戏如何制作优美的音乐
  16. SwiftUI 色彩教程之 01什么是色差Color difference
  17. 大数据工程师和数据分析师有何区别
  18. 微信头像更新了,有你喜欢的吗?
  19. ipad pro无法连接wifi终极解决方法
  20. 树莓派 配置USB麦克风声卡

热门文章

  1. LeetCode-717. 1比特与2比特字符
  2. python socket编程在阿里云的esc服务器下 [Errno 99] Cannot assign requested address解决方式
  3. 滴滴拉屎之后是什么?
  4. JS怎么唤醒高德导航
  5. Windows10 下面一个非常快速而精悍的看图软件 - IrfanView
  6. 五线谱如何快速修改谱号,Overture这个小技巧必须要掌握!
  7. charles抓包(别名:茶壶)
  8. Android App瘦身实战
  9. 《正确写作美国大学生数学竞赛论文》摘录笔记
  10. DirectX大作业——3D场景地图