python获取服务器响应cookie

本文介绍了一次解决网站模拟登录过程中无法正确获取Cookies的问题经历。通过调整代码和深入理解requests库的工作原理,找到了问题所在并给出了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结

调试网站获取cookies时请查看,r.header和r.request.header这两个属性,因为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)

事情经过

 事情的发生是这样的,今天我在调试一个网站的模拟登陆,但是怎么调试都调试不出来这个网站返回的cookie(因为我是用r.headers来获取cookies的),后来我就在想是不是我的请求头没有设置正确,然后我就遍历了r.request.headers,然后这个变量如实的打印了我的请求头的信息,但是我仔细一看cookie怎么出现了变化,咦,这不就是我需要的响应cookie吗!
 难道是我对r.request这个对象的理解出错了吗?以前我一直认为这个对象里面存储的是我请求发出去的信息,现在怎么会出现响应cookie呢?
 就在我百撕不得其解的时候,我去翻阅了requests库的官方文档关于respond对象中包含的request的解释,它上面写着“The PreparedRequest object to which this is a response.”(表示看不到什么意思,百度翻译也翻译不清楚),咦,好像是和响应有关啊,看来应该是我的理解出现了错误。

更好的解决方案

  那当然是用requests提供的"会话对象",他能够自动的保留请求所获取的参数。
  具体请跳转传送门:http://cn.python-requests.org/zh_CN/latest/user/advanced.html#request-and-response-objects

后来

  后来我发现原来是因为我在请求头里面写了“Host”,“Referer”,导致Cookie出现异常的原因,所以以后不要随便写这两个参数了,要写就照着封包里的写。
### 如何通过 Python 的 `requests` 库从 HTTP 响应中提取 Cookies 可以通过 `requests` 库发送 HTTP 请求,并利用返回的响应对象 `.cookies` 属性来提取服务器返回的 Cookie。以下是具体实现方法: #### 使用示例代码 下面是一段完整的代码示例,展示如何使用 `requests` 库向目标 URL 发起 GET 请求并提取响应中的 Cookies。 ```python import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" } url = 'https://httpbin.org/cookies/set/sessioncookie/123456789' # 发送请求 response = requests.get(url, headers=headers) # 提取Cookies if response.cookies: cookies_dict = {name: value for name, value in response.cookies.items()} print("Extracted Cookies:", cookies_dict) else: print("No cookies found in the response.") ``` 上述代码展示了如何访问 `response.cookies` 并将其转换为字典形式以便于后续操作[^1]。 #### 处理更复杂的场景 当需要手动管理 Cookies 或者在多个请求之间共享同一个会话时,可以使用 `Session` 对象。这种方式能够保持跨请求的状态一致性(例如持久化 Cookies)。以下是一个基于 Session 的例子: ```python with requests.Session() as session: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } # 设置第一个请求 set_cookie_url = 'https://httpbin.org/cookies/set/sessioncookie/12345' first_response = session.get(set_cookie_url, headers=headers) # 获取第二个页面的数据,此时已包含上一步设置好的Cookie get_data_url = 'https://httpbin.org/cookies' second_response = session.get(get_data_url, headers=headers) if second_response.json().get('cookies'): print("Current Cookies:", second_response.json()['cookies']) else: print("Failed to retrieve any cookies from the server.") ``` 此代码片段说明了如何创建一个持续存在的连接会话,在该会话期间所有的请求都会自动带上之前收到的 Cookies[^2]。 #### 注意事项 需要注意的是,某些网站可能会拒绝没有适当 User-Agent 字符串或其他必要头部字段的请求;因此建议始终自定义 Headers 来模拟真实的浏览器行为[^3]。 另外,对于流式传输的大文件下载或者仅需读取部分数据的情况,则可能需要用到 `stream=True` 参数配置以及直接访问原始 socket 数据的功能[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值