requests.session拿不到cookies
时间: 2024-10-04 22:00:46 浏览: 59
当你使用Python的requests库创建一个session并尝试获取cookies时,可能会遇到一些问题。这通常发生在以下几个情况:
1. **初始化不正确**:确保你在创建session时正确设置了cookies,例如:
```python
s = requests.Session()
s.cookies = requests.utils.cookiejar_from_dict({'your_cookie_key': 'your_cookie_value'})
```
2. **响应头缺少Set-Cookie**:如果服务器返回的响应头里没有包含cookie信息,session将无法自动获取。你需要手动添加:
```python
response = s.get('http://example.com')
s.cookies.update(response.cookies)
```
3. **跨域限制**:浏览器出于安全原因,对于同源策略(CORS)受限的请求,不会发送或接受来自其他域名的cookies。如果你试图从不同来源获取cookies,session可能无法获取。
4. **会话管理问题**:确保你的session配置正确地跟踪了cookies,尤其是在处理状态保持、重定向或登录等情况时。
如果你已经检查过以上几点还是拿不到cookies,可以尝试打印session cookies看是否有异常,并检查相应的网络请求是否包含了预期的cookie。如果还有疑问,记得提供具体的代码片段以便更好地分析问题。
相关问题
requests.Session如何不使用session得cookie ,然后自己自定义cookie
要在`requests.Session`中不使用自动管理的cookie,而是自定义cookie,可以使用`requests`库提供的`session.cookies`属性来设置cookie。以下是实现的基本步骤:
1. 导入`requests`库:
```python
import requests
```
2. 创建一个`Session`对象:
```python
session = requests.Session()
```
3. 创建一个`cookies`字典,包含自定义的cookie信息:
```python
cookies = {
'cookie_name1': 'value1',
'cookie_name2': 'value2',
# 添加更多的cookie
}
```
4. 将自定义的cookie设置到`Session.cookies`属性中:
```python
session.cookies.update(cookies)
```
5. 继续发送请求时,`Session`对象会使用自定义的cookie信息。
完整的代码示例:
```python
import requests
session = requests.Session()
cookies = {
'cookie_name1': 'value1',
'cookie_name2': 'value2',
# 添加更多的cookie
}
session.cookies.update(cookies)
response = session.get(url)
```
通过这种方式,你可以在`Session`对象中自定义cookie,并在后续请求中使用这些自定义的cookie信息。注意,这种方式会覆盖原来由服务器发送的任何cookie。
下面的这段代码为什么会报错?应该怎么解决?import requests import re import os session = requests.Session() # (1) 爬取m3u8文件的链接 url = "https://www.9tata.cc/play/14999-1-0.html" headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } res = session.get(url, headers=headers, verify=False) m3u8_link = re.search('now="(.*?m3u8)"', res.text).group(1) print(m3u8_link) # https://ikcdn01.ikzybf.com/20221015/ecMSO74h/index.m3u8 print(os.path.dirname(m3u8_link)) # 顺便抓一个名字 # name = re.search(r'<td class="col2 hidden-xs">(?P<name>\w+)</td>', res.text).group("name") # print("name", name) # (2) 爬取m3u8文件 res = session.get(m3u8_link) print(res.text.split("\n")[2]) # m3u8_detail_link = os.path.join(os.path.dirname(m3u8_link), res.text.split("\n")[2]) print(m3u8_detail_link) # (3) 爬取m3u8具体文件 res = requests.get(m3u8_detail_link) print(res.text)
这段代码可能会报错因为:
1. 请求 `https://www.9tata.cc/play/14999-1-0.html` 返回的内容中可能没有符合正则表达式 `'now="(.*?m3u8)"'` 的内容,导致 `re.search` 函数返回 `None`,再调用 `.group(1)` 方法就会抛出 AttributeError。
2. 在注释 (2) 中,由于 `res.text.split("\n")[2]` 可能不存在,因此会抛出 IndexError。
3. 如果在注释 (2) 中成功获取到 `m3u8_detail_link`,由于该链接是相对链接,需要使用 `urllib.parse.urljoin` 函数将其与 `os.path.dirname(m3u8_link)` 拼接起来才能得到完整链接。
4. 在注释 (3) 中,使用了 `requests.get` 函数而不是之前创建的 `session.get` 方法,这意味着没有传递之前设置的 headers 和 cookies,可能会导致请求失败。
要解决这些问题,可以按照下面的方式修改代码:
```python
import requests
import re
import os
from urllib.parse import urljoin
session = requests.Session()
url = "https://www.9tata.cc/play/14999-1-0.html"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
# (1) 爬取m3u8文件的链接
res = session.get(url, headers=headers, verify=False)
m3u8_match = re.search(r'now="(.*?m3u8)"', res.text)
if m3u8_match:
m3u8_link = m3u8_match.group(1)
print(m3u8_link)
# (2) 爬取m3u8文件
res = session.get(m3u8_link)
if res.ok:
m3u8_detail_link = urljoin(os.path.dirname(m3u8_link), res.text.split("\n")[2])
print(m3u8_detail_link)
# (3) 爬取m3u8具体文件
res = session.get(m3u8_detail_link)
if res.ok:
print(res.text)
else:
print("Failed to get m3u8_detail_link")
else:
print("Failed to get m3u8_link")
else:
print("Failed to find m3u8_link")
```
阅读全文