【问题标题】:Set new cookie between requests with Python Requests使用 Python 请求在请求之间设置新的 cookie
【发布时间】:2014-10-19 11:14:39
【问题描述】:

我现在正在这样做,但在最后一行以 TypeError: expected string or buffer 失败。

import requests
from urllib.parse import urlparse

url = 'some url'

s = requests.Session()
s.headers.update({
    'Origin':urlparse(url).netloc,
    'Referer':url
})


r = s.get(url)

s.cookies['cookie1'] = 25
s.cookies['cookie2'] = 25

r = s.post(
    url,
    {'param':'value1', 'param2':'value2'},
    headers={'X-Requested-With':'XMLHttpRequest'}
)

使用Session 时更新 cookie 的正确方法是什么?我对 Python 很陌生,所以我可能会混淆一些东西。使用 Python 3.4.1。

追溯:

Traceback (most recent call last):
  File "file.py", line 37, in <module>
    {'param':'value1', 'param2':'value2'}
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/sessions.py", line 498, in post
    return self.request('POST', url, data=data, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/sessions.py", line 422, in request
    prep = self.prepare_request(req)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/sessions.py", line 360, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/models.py", line 296, in prepare
    self.prepare_cookies(cookies)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/models.py", line 491, in prepare_cookies
    cookie_header = get_cookie_header(self._cookies, self)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests/cookies.py", line 134, in get_cookie_header
    jar.add_cookie_header(r)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/cookiejar.py", line 1329, in add_cookie_header
    attrs = self._cookie_attrs(cookies)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/cookiejar.py", line 1288, in _cookie_attrs
    self.non_word_re.search(cookie.value) and version > 0):
TypeError: expected string or buffer

【问题讨论】:

  • cookies['cookie1'] = '25' 等...(我想您的示例可能是 r.cookies.update(cookie1='25', cookie2='25') - 因为您正在有效地更新请求对象本身的 cookie(除非您的意思是 cookies = r.cookies.copy()。它会有所帮助如果您包含完整的回溯...
  • 稍微更改了代码并在问题中添加了回溯。

标签: python session cookies python-requests


【解决方案1】:

Cookie 值是字符串,而不是整数。将它们设置为:

s.cookies['cookie1'] = '25'
s.cookies['cookie2'] = '25'

演示:

>>> import requests
>>> from urllib.parse import urlparse
>>> url = 'http://httpbin.org/cookies'
>>> s = requests.Session()
>>> s.headers.update({
...     'Origin':urlparse(url).netloc,
...     'Referer':url
... })
>>> r = s.get(url)
>>> s.cookies['cookie1'] = '25'
>>> s.cookies['cookie2'] = '25'
>>> r = s.get(url, headers={'X-Requested-With':'XMLHttpRequest'})
>>> print(r.text)
{"cookies": {"cookie1": "25", "cookie2": "25"}}

【讨论】:

  • 重要的是,当您通过这个类似dict的接口(即mySession.cookies["cookie_name"] = "cookie_value")添加cookie时,它将用于您发送请求的所有域.如果您需要仅在特定域上使用 cookie,请使用 .set() methodmySession.cookies.set("cookie_name", "cookie_value", domain=".specific-domain.com") 如果您在上面的代码中添加此内容,则不会发送 cookie_name cookie,因为它的基本域不会匹配请求的域(“httpbin.org”)。
猜你喜欢
  • 2021-10-03
  • 2017-03-10
  • 2014-02-08
  • 2016-07-21
  • 2015-07-29
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多