9

这是我的代码。

import requests
from sys import exit
proxies = {
    "http": "127.0.0.1:8888",
    "https": "127.0.0.1:8888",
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0",
    "Accept-Encoding": "gzip, deflate",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Connection": "keep-alive"
}


login_page = "http://www.test.com/login/"
r = requests.get(login_page, proxies = proxies, headers = headers)
original_cookies = r.cookies
exit(0)

这是我从 fiddler2 得到的。如您所见,它添加了一个额外的 header Accept-Encoding: identity

GET http://www.test.com/login/ HTTP/1.1
Accept-Encoding: identity
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Host: www.test.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0

我在 Windows 7 64 位上使用 Python 3.3.2 并请求 1.2.3。

任何人都可以提供一些建议吗?

谢谢。

4

1 回答 1

6

这起源于 的 内心深处http.client, 被 哪个 使用urllib3哪个 被 使用requests

http.client实际上检查是否已经accept-encoding在 headers 字典中传递了一个,如果有它跳过添加identity标题 - 唯一的问题是作为 headers 字典传递的内容是这样的:

CaseInsensitiveDict({b'Accept-Encoding': 'gzip, deflate, compress', ...})

那么为什么它不起作用呢?requests 对标头名称进行编码,并且在 python3 中,与str对象相比的bytes对象始终是False,执行的检查http.client失败...

如果您真的想摆脱额外的标头,最快的方法是注释掉requests/models.py 中的第 340 行,或 monkeypatchrequests.models.PreparedRequest.prepare_headers

编辑
这似乎已在(尚未发布的)2.0 请求分支中修复

于 2013-09-09T20:17:12.573 回答