本节重点讲的是python爬虫中的session和cookie在爬虫中的应用,所以12306验证码的破解可能相比手工操作更麻烦,但未来会讲解更容易的验证码破解和12306登陆~
cookie和session引入:我们在浏览一些网址可能不需要使用账户密码,但要想进行一些个人操作(如评论、购买东西)就需要我们的账户以识别个人身份,这时候我们就需要输入账户和密码。
这里,我们注意到自己的账户和密码是不显示在网页上面,通常是存储在formdata内,要不然个人信息就会泄露,而这种请求就是post请求。
而post请求就涉及到cookies和session两个参数,下面让我们来一一介绍。

1 cookie介绍

1.1 定义

cookie: 记录身份信息。当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”,如果你勾选了,以后你再打开这个网站就会自动登录,这就是cookie在起作用。(1)当你登录微博账号123456,并勾选“记住我”。(2)服务器就会生成一个cookies和123456这个账号绑定。(3)接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。(4)当下一次,浏览器带着cookies访问博客,服务器会知道你是123456,你不需要再重复输入账号密码,即可直接访问。注意a: 然而过一段时间,cookie会失效,需要再次输入注意b:有些网址也通过cookie来反爬,即使不需要登录输入信息,本节就是用讲的这种情况

总结:

图片来源于:python总结-cookies概念

1.2 应用

  • resp.cookies,resp.cookies.get_dict()获取cookie值
# requests.cookie()
# cookie保持一个登录的状态,进行一个会话的维持
# 例子1 :get方法请求,提取百度的cookie
import requests
resp = requests.get('https://www.baidu.com/')
print(resp.cookies)  # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
print(resp.cookies.get_dict()  # {'BDORZ': '27315'}# 例子2:post方法请求,提取网页的cookie
login_in = requests.post(url,headers=headers,data=data)
#提取cookies的方法:调用requests对象(login_in)的cookies属性获得登录的cookies,并赋值给变量cookies。
cookies = login_in.cookies
123456789101112
  • headers里面添加cookie设置以阻止反爬、实现登录和会话维持
#模拟登陆知乎
url = 'https://www.zhihu.com/hot'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
resp = requests.get(url,headers=headers)
print(resp.text)  # 无法登录,因为headers里面没有录入cookie数据
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','cookie':'_zap=f6651dfd-8259-4706-9032-5727ec6593ff; d_c0="AKAWpA4b6BCPTrYOvjRlh-tSAC2xRRy2R_o=|1583234256"; _ga=GA1.2.1237704894.1583234257; _xsrf=EQmHq5EuP5gF6Ja6bH46i3znv0r53niY; _gid=GA1.2.1825342243.1588076980; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1587811271,1588076979,1588228873,1588246738; SESSIONID=aq5YCH9MiITrFZOobkIFT3EYgtlfG6SlvGwVB2EUB1F; JOID=UFwUAkLNy7aYh4WBEc5mLyDPZL4Dqr-Dyc_LvVyvhOfqydTIe7wBFMWKhoQZq-aJtgz8-vsmayVtXOxAwCJS2b4=; osd=UlgUC0zPz7aRiYeFEcdoLSTPbbABrr-Kx83PvVWhhuPqwNrKf7wIGseOho0XqeKJvwL-_vsvZSdpXOVOwiZS0LA=; capsion_ticket="2|1:0|10:1588254120|14:capsion_ticket|44:Yjk0ZTgyMjRjZDU0NGFlMjgwMzU4ZmZkMWJhYzA5MmI=|fdf13162982002c673847fae50e99c8f22d583ef7e23228c2d3ace7080b56ee7"; z_c0="2|1:0|10:1588254121|4:z_c0|92:Mi4xRjdYeENBQUFBQUFBb0Jha0Rodm9FQ1lBQUFCZ0FsVk5xU09ZWHdEcnRjZFhPSlkwdXpYZXFualQtekloamplbzdn|76d278afd875611d83dba20ed4d6169d34d0bf1447521478b93ec7ec38c443ae"; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1588254123; KLBRSID=ca494ee5d16b14b649673c122ff27291|1588254207|1588252528'}
resp = requests.get(url,headers=headers)
print(resp.text)  # 实现登录,因为headers录入了cookie数据123456789

2 session介绍

2.1 定义

session:会话,用于记录用户上网浏览的信息。例子:我们从浏览器上网到关闭浏览器的这一过程。session是会话过程中,服务器用来记录特定用户会话的信息。比如今天浏览微博,浏览了哪些话题,这些记录都会被保存在session中。

2.2 session和cookie关系

(1)互相存储信息:cookies中存储着session的编码信息,session中又存储了cookies的信息。举例:当我们登录微博账号123456,并勾选“记住我”。服务器就会生成一个cookies和123456这个账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问博客,服务器会知道你是123456,你不需要再重复输入账号密码,即可直接访问。这样就能够持续保持会话进行。(2)应用:登陆网址,发表评论这个例子来源于(转载):Python学习之cookies及session用法本人觉得对比较有用,所以想敲一敲,学习一下,并搬运于此,供大家学习

import json,requests# 用requests.session()创建session对象,相当于创建了一个空的会话框,准备保持cookies
session = requests.sessions()
# 添加请求头,避免被反爬虫。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}# 读取cookies:先把字符串转成字典,再把字典转成cookies本来的格式
def cookie_read():cookie_txt = open('cookie.txt','r')cookie_dict = json.loads(cookie_txt.read())cookie = requests.utils.cookiejar_from_dict(cookie_dict)return (cookie)# 登录网址,得到cookie,存储cookie(先转成字典,再转成字符串)
def sign_in():url = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-login.php'data =  {'log': input('请输入你的账号'),'pwd': input('请输入你的密码'),'wp-submit': '登录','redirect_to': 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-admin/','testcookie': '1'}# 在创建的session下用post发起登录请求,session这个时候就包括 cookies 了。session.post(url,headers=headers,data=data)# cookies存储cookie_dict = requests.utils.dict_from_cookiejar(session.cookies)cookie_str = json.dump(cookie_dict)f = open('cookie.txt','w')f.write(cookies_str)f.close()# 登录成功,发表评论
def write_message():url2 = 'https://wordpress-edu-3autumn.localprod.oc.forchange.cn/wp-comments-post.php'data_2 = {'comment': input('请输入你要发表的评论:'),'submit': '发表评论','comment_post_ID': '13','comment_parent': '0'}return (session.post(url_2, headers=headers, data=data_2))   # 在创建的session下用post发起登录请求,session这个时候就包括 cookies 了。# 针对cookies过期的问题,需重新登录,重新保存cookie信息
try:session.cookies = cookie_read()
except FileExistsError:sign_in()session.cookies = cookie_read()
result = write_message()
if result.status_code == 200:print('评论成功!')
else:sign_in()session.cookies = cookie_read()result = write_message()

3 综合应用——以12306为例

3.1 12306的验证码破解

(1)了解12306的身份验证顺序:用户名(正确)-密码(正确)-验证码(错误)–点击登录

输入:用户名(错误)-密码(错误)-验证码(正确)-点击登录

== 得出 12306是先验证验证码-再验证账户密码 ==

result_message: "验证码校验成功", result_code: "4"}

2)理清破解验证码流程

1.请求目标url
2.拿到12306的验证码
3.点击正确验证码

3.1.1 设置参数,请求目标url

传入data、headers参数

data = {'answer': codeStr,'rand': 'sjrand','login_site': 'E'}
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.

获取url位置:

# 1.请求url
response = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check',data=data,headers=headers)
print(response)  # <response [200]说明请求成功,到达目标网址>
print(response.txt) # 打印内容,验证码信息失败,信息为空 

3.1.2 拿到12306的验证码

第一种方法: 打开图片链接 - 用base64模块处理 - 存储图片

import base64
# 正常图片长度一般不长
s = 'https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1588854070&di=e940d954e46236fcaf2ef5c5b99a800&src=http://pic3.16pic.com/00/01/11/16pic_111395_b.jpg'
# 12306图片网址很长,做了一个base64处理
url = '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'
# 用python内置模块处理
img_data = base64.b64decode(url)
fn = open('code.png','wb')
fn.write(img_data) # Error: Incorrect padding No  不正确的填充,需要去掉url的前置 ‘data:image/jpg;base64’
fn.close()

第一种方法太长,不推荐。推荐第二种方法:在网页中寻求响应

查找两个url的相同处,得到验证码图片

# 第一个url
# https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1588854482831&callback=jQuery19106102610091091487_1588854471128&_=1588854471129
# 第二个url
# https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1588854489430&callback=jQuery19106102610091091487_1588854471128&_=1588854471130
# 相同处
https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand
# 去掉64,得到验证码图片
# https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand 12306的验证码图片

# 2.拿到12306的图片验证码 pic_response = req.get('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand') codeImage = pic_response.content fn = open('code2.png','wb') fn.write(codeImage) fn.close()

3.1.3 输入正确验证码

codeStr = input('请输入验证码坐标:')
data = {'answer': codeStr, 'rand': 'sjrand',login_site':'E'}

输入正确的验证码后还是失败,原因是没有保持会话的继续,这个时候需要session来保持会话进行

import requests
req = requests.session()
response = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check',data=data,headers=headers)

3.1.4 完整练习

# {result_message: "验证码校验成功", result_code: "4"}
import requests
req = requests.session()
def login():# 2.拿到12306的图片验证码pic_response = req.get('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand')codeImage = pic_response.contentfn = open('code2.png','wb')fn.write(codeImage)fn.close()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}codeStr = input('请输入验证码坐标:')data = {'answer': codeStr,'rand': 'sjrand','login_site': 'E'}# 1.请求目标urlresponse = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check',data=data,headers=headers)print(response.text)
# 3.点击正确的目标图片
login()

3.2 浏览12306的车次列表

import requests
def query():# headers 里面要添加cookie,才能访问页面内容headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','Cookie':'JSESSIONID=C69BB3C1423FE2782FBADBC6CCFFC1DB; _jc_save_toStation=%u6210%u90FD%2CCDW; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u957F%u6C99%2CCSQ; BIGipServerpassport=854065418.50215.0000; RAIL_EXPIRATION=1589138029444; RAIL_DEVICEID=GOUQ6YuSBKleYqFcUjEYfjqmJao9QkmcsX3v1DiP6qe2WIr1c0M6YJBDldFcO70lExNRkFiGF84NgrReBrIh95J9Fx0gL4RAM7sFfRDucqk4TkbR1Yz9TeSdrb8bo5H6p3LA_-P5QuCHROE9v4qeJojUO8G1ActN; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_toDate=2020-05-07; _jc_save_fromDate=2020-05-14; BIGipServerpool_passport=233636362.50215.0000; BIGipServerportal=2949906698.17695.0000; BIGipServerotn=1257243146.64545.0000'}r = requests.get('https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2020-05-14&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=CDW&purpose_codes=ADULT',headers=headers)print(r.content.decode('utf-8'))
query()

需要源码或者视频教程的记得加群:1136192749

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

  1. 利用 Python 破解 ZIP 或 RAR 文件密码

    利用 Python 破解 ZIP 或 RAR 文件密码 破解原理 实验环境 库 利用 Pipenv 安装 rarfile 编码 准备密码本 读取压缩文件 尝试解压 暴力破解 程序入口 使用 运行结果: ...

  2. 【Python】利用python进行数据分析——以新型冠状病毒疫情为例

    [Python]利用python进行数据分析--以新型冠状病毒疫情为例 重要说明 只提交该文档这一个文件,做完后提交到学习通"结课大作业"中. 1. 文件命名: 必须以学号-姓名- ...

  3. 利用python进行股票技术分析--以茅台为例

    """ 利用python进行股票技术分析–以茅台为例 通过下述策略对利用python进行股票技术分析,可以举一反三,并且能够实现复杂的技术分析策略,同时可以同python ...

  4. Python破解12306图片验证码

    不知从何时起,12306的登录验证码竟然变成了按字找图,可以说是又提高了一个等次,竟然把图像识别都用上了.不过有些图片,不得不说有些变态,图片的清晰图就更别说了,明显是从网络上的图库中搬过来的. 谁知 ...

  5. 模仿黑产破解12306验证码,验证码产品的未来是?

    导读:12306验证码,长时间高居反人类产品排行榜第一名(据某网站调查),普通人一次通过率仅8%,人也识别不清的图片就能成功阻挡自动机了吗?谷歌街景验证码完全取自自然环境确保图片的不重复不被爆破,但是 ...

  6. python开发12306抢票_如何利用 Python 实现12306抢票?

    生苦短,我用 python. 作为一种"胶水语言",python 为无数码农带来了便利:同时,越来越多的 python 工程师被标榜为"高薪党":"全 ...

  7. 利用keras破解captcha验证码

    本文参考了知乎上的一篇文章,只做了少许改动,感觉挺好玩的,自己实现了一下,准确率比原作者的要高一些.如果想要了解原创文章的话,请移步知乎:使用深度学习来破解captcha验证码 本文通过keras深度 ...

  8. Python破解滑块验证码算法,完美避开人机识别

    | 完美是不可能的,加个震惊!Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login pyt ...

  9. 利用Python解决豆瓣验证码,实现模拟登陆!

    前言: 更为重要的一件事情是它是纯Python编程语言开发的!!! 所以咱们利用Python去搞定它的验证码实现模拟登陆,是有一定意义的哟! 实战: Python 3.6.5 解释器 pycharm ...

最新文章

  1. Jittor框架API
  2. ApacheCN 数据科学/人工智能/机器学习知识树 2019.2
  3. 如何使用wink框架_如何解决Wink Hub的Z-Wave连接问题
  4. 用java设计秒表_运用Java编写 秒表程序
  5. C语言递归算法(一)
  6. Kerberos学习(一)
  7. 高可用高性能负载均衡软件HAproxy详解指南-第一章(简介、安装)
  8. SAP 产品条码WMS结合 以及ABAP script的集成 BarCode
  9. 关于徒手脱壳的几种方法
  10. Linux学习笔记 (五)关机和重启命令
  11. C++请不要问我string s=”a”+”b”分配了几次内存
  12. Python 100道题深入理解
  13. matlab画漫画,震惊!无聊男子竟用函数画出可爱的卡通猫
  14. 如何解决CC2640用IAR下载固件出现Fatal error: Failed to load the CPU core driver Session aborted的问题
  15. ubuntu conda、pip 设置代理
  16. 安卓开发学习——第四天
  17. 苹果首席设计师:iPhone X 耗时五年,设计要等技术赶上
  18. mysql----where 1=1是什么意思
  19. 3Dmax怎么渲染AO图?云渲染AO图是什么?
  20. R语言回归分析-回归诊断

热门文章

  1. excel多文件查询工具
  2. ubuntu16.04下编译ORB_SLAM3时出现的问题及解决方法
  3. python 判断x是否为英文字母 数字 空格
  4. uni-simple-router 注意事项
  5. 数学建模 - 椅子放在不平整的地上能否站稳(长方形)
  6. 高等教育计算机应用基础试题,高等教育自学考试《计算机应用基础》模拟试题...
  7. 备份数据库 用友NC
  8. 用电梯服务器怎样解电梯显示E34,成为电梯高手之三菱-菱云系列电梯故障代码表...
  9. 上海三菱电梯LEHY,LEGY,上海三菱,758 .778详 细地址码,总共100多页
  10. unity3d开发鼠标打飞碟游戏(Hit UFO)