正常情况下,我们想打开禅道的“组织”视图页面,是需要先在禅道的登录页面输入正确的用户名和密码点击登录,再切换到“组织”视图页面。
如果我们的python代码这样写的话,r1和r2的状态码都是200,但r2.text并不是我们想要的。这是因为,r1和r2请求相当于在2个不同的浏览器中,发出的两个请求,彼此是独立的,那么r2请求就相当于是在没有登录的情况下发出的请求。
import requests
paylod = {'account':'admin',
'password':'e10adc3949ba59abbe56e057f20f883e'}
url01 = 'http://localhost:9000/zentao/user-login.html'
url02 = 'http://localhost:9000/zentao/company-browse.html'
r1 = requests.get(url01,params=paylod)
r2 = requests.post(url02)
print(r1.status_code)
print(r2.status_code)
print(r2.text)
那么如何解决这个问题呢
1、我们可以创建一个session对象来存储请求的缺省值,r2.text可以取到想要的值。
import requests
s=requests.session()
paylod = {'account':'admin','password':'e10adc3949ba59abbe56e057f20f883e'}
url01='http://localhost:9000/zentao/user-login-L3plbnRhby8=.html'
url02='http://localhost:9000/zentao/user-create-0.html'
r1=s.get(url01,params=paylod)
r2=s.post(url02,data=d)
print(r2.text)
2、可以直接加上auth认证,那么r2请求也可取到相应的值,而不需要登录。(用户名:admin,密码:123456)
import requests
from requests.auth import HTTPBasicAuth
url02 = 'http://39.106.90.48:9000/zentao/company-browse.html'
r2 = requests.post(url02,auth=HTTPBasicAuth('admin','123456'))
print(r2.status_code)
print(r2.text)
requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数,类似于以下urllib库的使用:
cookie =http.cookiejar.CookieJar()
handler = urllib.request.HttpCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
然后该opener里面就保存了cookie,以后无论访问该网站的那个网页都是自动的带上同一个cookie,此cookie就是你第一次登陆该网站时的cookie,
opener(url)---url可以使该网站的任意网页,这就是跨请求的意思,请求不同的网站就是跨请求携带同样的cokkie等参数.
有验证码没有登录成功,如何在requests session中手动设置cookie.
在使用python requests库时遇到一个问题,就是如何在session中设置对所有请求都生效的cookie?requests中的session对象一大特性就是它会自动为你管理cookie,当你登录一个页面时,它可以自动识别response中的set cookie头,然后为下面的请求一直维持这个cookie。不过我在使用的过程中,因为目标网站登录有验证码,所以打算每次运行时手动登录页面获取cookie,然后再把cookie写到代码变量中。这里遇到的问题就是当在get函数中传入cookie变量时,cookie只对当前的请求进行生效,下一次调用get还需要再传入一次cookie,否则发出去的请求是默认不会带有cookie的。
如下:
import requests
import time
mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
s = requests.session()
s.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
s.get("http://127.0.0.1:80"
运行脚本后,通过抓包发现,第一次get请求的中含有我自定义的cookie,第二次请求中却没有。因为我要对很多http接口发送请求,所以如果在每个get里面都加入一个cookie变量的话,写起来就有些麻烦了。于是google了一下,找到了如下的解决方法:
import requests
import time
mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }
s = requests.session()
# 手动设置cookie
requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})
s.get("http://127.0.0.1:80",cookies = mycookie)
time.sleep(5)
sz.get("http://127.0.0.1:80")
这样,通过requests.utils.add_dict_to_cookiejar对session对象设置cookie,之后所有的请求都会自动加上我自定义的cookie内容。
也可以通过requests.utils.cookiejar_from_dict 先生成一个cookiejar对象,时候在赋值给session.cookies。貌似还可以使用session.cookies.set()或者update()。
# session()中方法和requests()中一样
# session.get() session.post()
session = requests.session()
使用session发送post请求获取cookie保存到本地session中。
以人人网登录为例。
post_url = "http://www.renren.com/PLogin.do"
headers = {"User-Agent": "Mozilla/5.0"}
s = requests.session()
post_data = {"email": "username", "password": "password"}
s.post(post_url, headers=headers, data=post_data)
使用session请求登录后的页面
得到登录后的网页内容
url = "http://www.renren.com/xxxxx/profile"
response = s.get(url, headers=headers)
单独处理cookie字段,处理为字典格式
处理cookie内容为字典
cookie = "SINAGLOBAL=821034395211.0111.1522571861723; wb_cmtLike_1850586643=1; un=tyz950829@sina.com; wb_timefeed_1850586643=1; UOR=,,login.sina.com.cn; wvr=6; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWsNeq71O_sXkkXNnXFHgOW5JpX5KMhUgL.Fo2RSK5f1hqcShe2dJLoI0qLxK-L12qLB-zLxKqL1hnL1K2LxK-LBo5L12qLxKqL1hML1KzLxKnL1K.LB-zLxK-L1K-LBKqt; YF-V5-G0=c99031715427fe982b79bf287ae448f6; ALF=1556795806; SSOLoginState=1525259808; SCF=AqTMLFzIuDI5ZEtJyAEXb31pv1hhUdGUCp2GoKYvOW0LQTInAItM-ENbxHRAnnRUIq_MR9afV8hMc7c-yVn2jI0.; SUB=_2A2537e5wDeRhGedG7lIU-CjKzz-IHXVUm1i4rDV8PUNbmtBeLVrskW9NUT1fPIUQGDKLrepaNzTEZxZHOstjoLOu; SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"
字典推导式
cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}