Python获取服务器响应Cookie的调试与解决方案
本文介绍在Python中使用Requests库获取网站Cookie时遇到的常见陷阱。通过调试发现,某些情况下服务器返回的Cookie可能存在于r.request.headers而非r.headers中。文章分析了请求头中Host和Referer字段对Cookie返回的影响,并推荐通过会话对象自动管理Cookie的最佳实践,帮助开发者解决模拟登录中的Cookie获取问题。
总结
在调试网站以获取Cookies时,请仔细检查r.headers和r.request.headers这两个属性,因为Cookie可能出现在其中任意一个里面,具体位置取决于服务器的响应机制。
先贴一个代码
import re
import requests
from bs4 import BeautifulSoup
def printHeaders(headers):
for h in headers:
print(h+" : "+headers[h] + '\r\n')
def printCookies(cookies):
for h in cookies:
print(h+" : "+cookies[h] + '\r\n')
def loginFw(id,password):
url = "http://xxxxx/login.asp"
try:
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Host':'www.xxx.org',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding':'gzip, deflate',
'Content-Type':'application/x-www-form-urlencoded',
'Referer':'http://xxx/login.asp',
'Connection':'keep-alive',
}
params = {"Reglname":id,"reglpassword":password}
r = requests.post(url,data=params,headers=headers)
printHeaders(r.request.headers) #服务器返回的cookie需要用r.request里的headers来获取
printHeaders(r.headers) #这里是获取不到服务器返回的cookie的
r.encoding = 'utf-8'
return r.text
except Exception as e:
print("登陆错误:"+str(e))
ret = loginFw("xxx@qq.com","xxx")
#print(ret)
事情经过
在调试一个网站的模拟登录功能时,我尝试通过r.headers来获取Cookies,但始终无法成功获取到网站返回的Cookie。这让我怀疑是否请求头设置不正确,于是我开始遍历r.request.headers。打印结果显示,虽然请求头信息正常,但我发现其中竟然包含了预期的响应Cookie,这与我之前的认知不符。
这让我困惑:难道我对r.request这个对象的理解有误?以往我一直认为该对象仅存储我发送出去的请求信息,为何会包含响应Cookie呢?
在百思不得其解之际,我查阅了Requests库官方文档中关于Response对象包含Request的解释。文档指出:“The PreparedRequest object to which this is a response.”(表示看不到什么意思,百度翻译也翻译不清楚),这似乎表明它与响应过程有关,看来是我之前的理解出现了偏差。
更好的解决方案
推荐使用Requests提供的“会话对象”(Session Object),它能够自动保留请求所获取的参数,包括Cookie,从而简化开发过程。
具体请跳转传送门:
http://cn.python-requests.org/zh_CN/latest/user/advanced.html#request-and-response-objects
后来
经过进一步排查,我发现导致Cookie出现异常的原因是在请求头中显式设置了“Host”和“Referer”字段。因此,建议今后不要随意手动设置这两个参数,除非完全按照封包中的原始值进行配置,以避免干扰Cookie的正常返回。
以上这篇python获取服务器响应cookie的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













