python|cookie和session介绍——以12306验证码破解

ccokie和session引入:在浏览一些网页时,要想进行个人操作,就需要 我们的账户以识别个人身份,这时需要输入账户和密码。
注意:账户和密码不显示在网页上面,通常是存储在formdata内,要不然个人信息就会泄露,而这种请求就是post请求。
而post请求就涉及到cookies和session两个参数。

1.1定义

  • cookie:记录身份信息。当登录一个网站,都会在登录页面看到一个可勾选的选项“记住我”。

  • 服务器就会生成一个cookies和123456这个账号绑定。

  • 接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。

  • 当下一次,浏览器带着cookies告诉你的浏览器,让 浏览器把cookies存储到你的本地电脑。

  • 当下一次,浏览器带着cookies访问博客,服务器会知道你是123456,你不需要再重复输入账号密码,即可直接访问。

注意a:过一段时间,cookie来反盘,即使不需要登录输入信息。
1.2应用
resp.cookies,resp.cookies.get_dict()获取cookie值

#cookie保持一个登录的状态,进行一个会话的维持
#例子1:get方法请求,提取百度的cookie
import requests
resp=request.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
  • 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','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)

2.session介绍
2.1定义
session:会话,用于记录用户上网浏览的信息。
例子:我们从浏览器上网到关闭浏览器的这一过程。session是会话过程中,服务器用来记录特定用户会话的信息。比如今天浏览微博,浏览了哪些话题,这些记录都会保存在session中。
2.2 session和cookie关系
(1)互相存储信息:cookie中存储着session的编码信息,session中又存储了cookie的信息。
(2)应用:登录网址,发表评论
例子:session和cookies的应用

import requests,json
session = requests.session()
#创建会话。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
#添加请求头,避免被反爬虫。
try:
#如果能读取到cookies文件,执行以下代码,跳过except的代码,不用登录就能发表评论。
    cookies_txt = open('cookies.txt', 'r')
    #以reader读取模式,打开名为cookies.txt的文件。
    cookies_dict = json.loads(cookies_txt.read())
    #调用json模块的loads函数,把字符串转成字典。
    cookies = requests.utils.cookiejar_from_dict(cookies_dict)
    #把转成字典的cookies再转成cookies本来的格式。
    cookies = session.cookies
    #获取会话下的cookies
 
except FileNotFoundError:
#如果读取不到cookies文件,程序报“FileNotFoundError”(找不到文件)的错,则执行以下代码,重新登录获取cookies,再评论。
 
    url = ' https://wordpress-edu-3autumn.localprod.forc.work/wp-login.php'
    #登录的网址。
    data = {'log': input('请输入你的账号:'),
            'pwd': input('请输入你的密码:'),
            'wp-submit': '登录',
            'redirect_to': 'https://wordpress-edu-3autumn.localprod.forc.work/wp-admin/',
            'testcookie': '1'}
    #登录的参数。
    session.post(url, headers=headers, data=data)
    #在会话下,用post发起登录请求。
 
    cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
    #把cookies转化成字典。
    cookies_str = json.dumps(cookies_dict)
    #调用json模块的dump函数,把cookies从字典再转成字符串。
    f = open('cookies.txt', 'w')
    #创建名为cookies.txt的文件,以写入模式写入内容
    f.write(cookies_str)
    #把已经转成字符串的cookies写入文件
    f.close()
    #关闭文件
 
url_1 = 'https://wordpress-edu-3autumn.localprod.forc.work/wp-comments-post.php'
#文章的网址。
data_1 = {
'comment': input('请输入你想评论的内容:'),
'submit': '发表评论',
'comment_post_ID': '7',
'comment_parent': '0'
}
#评论的参数。
session.post(url_1, headers=headers, data=data_1)
#在会话下,用post发起评论请求。

3.综合应用
3.1 12306的验证码破解

# {result_message: "验证码校验成功", result_code: "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.content
    fn = 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.请求目标url
    response = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check',data=data,headers=headers)

    print(response.text)






# 3.点击正确的目标图片

login()

import requests

def query():
    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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值