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()