Python 请求中如何处理和传递 cookie 的小疑问


from urllib import request
from http import cookiejar

if name == ‘main’: # 声明一个 CookieJar 对象实例来保存 cookie cookie = cookiejar.CookieJar() # 利用 urllib.request 库的 HTTPCookieProcessor 对象来创建 cookie 处理器,也就 CookieHandler handler = request.HTTPCookieProcessor(cookie) # 通过 CookieHandler 创建 opener opener = request.build_opener(handler) # 此处的 open 方法打开网页 response = opener.open(‘https://www.v2ex.com/’) # 打印 cookie 信息 for item in cookie: print(‘Name = %s’ % item.name) print(‘Value = %s’ % item.value)

2 个疑问:

一、利用上面的代码抓出的 cookie 可以是浏览器的中保存的吗?

二、利用这种方法我在抓某个站的时候提示

raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response

通过搜索引擎得知是服务器限制了爬虫,所以有没有什么办法伪造 User-Agent。我知道 request 的请求头可以伪

造但是这个 CookieJar 的有些不理解。

请各位大牛协助解决下问题,非常感谢


Python 请求中如何处理和传递 cookie 的小疑问

1 回复

在Python的requests库中处理cookie主要有两种方式:使用requests.Session()对象自动管理,或者手动操作requests.cookies.RequestsCookieJar

1. 使用Session对象(推荐) Session对象会在整个会话中保持cookie。你第一次请求后获得的cookie会自动在后续请求中携带。

import requests

# 创建一个会话
session = requests.Session()

# 第一次请求(例如登录),服务器会设置cookie
login_url = 'https://example.com/login'
login_data = {'username': 'user', 'password': 'pass'}
response = session.post(login_url, data=login_data)

# 后续请求会自动使用之前获得的cookie
profile_url = 'https://example.com/profile'
profile_response = session.get(profile_url)

print(profile_response.text)

2. 手动传递Cookie 你可以从响应中提取cookie,然后通过headers参数或cookies参数手动设置到下一个请求中。

import requests

# 第一个请求,获取cookie
first_response = requests.get('https://example.com/set-cookie-page')
# 从响应头获取cookie字符串
cookie_from_header = first_response.headers.get('Set-Cookie')
# 或者,使用response.cookies对象(一个RequestsCookieJar)
cookie_jar = first_response.cookies

# 方法A:通过headers字典传递(格式为"name=value")
headers = {'Cookie': 'session_id=abc123'}
second_response = requests.get('https://example.com/protected', headers=headers)

# 方法B:通过cookies参数传递(更清晰,推荐)
# 可以直接传递字典
cookies_dict = {'session_id': 'abc123'}
# 或者传递之前获取的RequestsCookieJar对象
second_response = requests.get('https://example.com/protected', cookies=cookie_jar)

核心要点:

  • 自动管理用Session:对于需要保持登录状态的一系列请求,用requests.Session()最简单。
  • 精细控制用手动传递:如果需要从某个响应中提取特定cookie,并选择性地传递给下一个特定请求,就手动操作response.cookies或构造字典。

总结:日常爬虫或模拟登录直接用Session,需要精细控制cookie传递时再手动操作。

回到顶部