如何为请求会话对象设置单个代理?

时间:2015-06-15 05:22:33

标签: python python-requests

我使用Python请求包发送http请求。我想在请求会话对象中添加一个代理。例如

session = requests.Session()
session.proxies = {...} # Here I want to add a single proxy

目前我正在遍历一堆代理,并且在每次迭代时都会创建一个新会话。我只想为每次迭代设置一个代理。

我在文档中看到的唯一例子是:

proxies = {
    "http": "http://10.10.1.10:3128",
    "https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

我试图遵循这一点,但无济于事。这是我的脚本代码:

# eg. line = 59.43.102.33:80
r = s.get('http://icanhazip.com', proxies={'http': 'http://' + line})

但是我收到了一个错误:

requests.packages.urllib3.exceptions.LocationParseError: Failed to parse 59.43.102.33:80

如何在会话对象上设置单个代理?

4 个答案:

答案 0 :(得分:61)

除了@neowu'回答之外,如果您想为会话对象的生命周期设置代理,您还可以执行以下操作 -

import requests
proxies = {'http': 'http://10.11.4.254:3128'}
s = requests.session()
s.proxies.update(proxies)
s.get("http://www.example.com")   # Here the proxies will also be automatically used because we have attached those to the session object, so no need to pass separately in each call

答案 1 :(得分:7)

事实上,你是对的,但是你必须确保你对这一行的定义,我试过这个,没关系:

>>> import requests
>>> s = requests.Session()
>>> s.get("http://www.baidu.com", proxies={'http': 'http://10.11.4.254:3128'})
<Response [200]>

您是否定义了line = ' 59.43.102.33:80'这样的行,地址前面有一个空格。

答案 2 :(得分:1)

除了到目前为止的解决方案外,还有其他设置代理的方法:

import requests

with requests.Session() as s:
    # either like this
    s.proxies = {'https': 'http://105.234.154.195:8888', 'http': 'http://199.188.92.69:8000'}
    # or like this
    s.proxies['https'] = 'http://105.234.154.195:8888'
    r = s.get(link)

答案 3 :(得分:0)

希望这可能会导致答案:

  

urllib3.util.url.parse_url(URL)   给定一个url,返回一个已解析的url namedtuple。执行尽力而为解析不完整的URL。未提供的字段将为None。

https://urllib3.readthedocs.org/en/latest/helpers.html

重新审核