【问题标题】:Python Requests doesnt work for https proxyPython 请求不适用于 https 代理
【发布时间】:2017-12-23 07:05:11
【问题描述】:

我尝试像这样在 python 中使用 https 代理:

proxiesDict ={
  'http':  'http://' + proxy_line,
  'https': 'https://' + proxy_line
}


response = requests.get('https://api.ipify.org/?format=json', proxies=proxiesDict, allow_redirects=False)

proxy_line 是从 ip:port 格式的文件读取的代理。我在浏览器中检查了这个 https 代理,它可以工作。但是在 python 中,这段代码挂了几秒钟,然后我得到了异常:

HTTPSConnectionPool(host='api.ipify.org', port=443): Max retries exceeded with url: /?format=json (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x0425E450>: Failed to establish a new connection: [WinError 10060] 

我尝试使用 socks5 代理,它适用于安装了 PySocks 的 socks5 代理。但是对于 https 我得到了这个例外,有人可以帮我吗

【问题讨论】:

  • 删除http://https://?另外,样本proxy_line 包含什么?
  • @COLDSPEED 谢谢!我认为它现在可以工作,但它给我的不是某些代理 ip,而是其他 ip。它不是我的 ip,但也不是代理 ip,在带有代理的浏览器中,我访问同一个站点并查看代理 ip。 proxy_line 包含这样的代理:79.110.31.87:8085,在浏览器中我访问api.ipify.org 时看到相同的 ip,但是从 python 中我得到了奇怪的地址
  • 这可能与allow_redirects=False 有关。在您的浏览器中,自动允许重定向。让我知道如果删除它可以解决它,我会为后代创建一个答案。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我尝试set allow_redirects=True,但结果仍然很奇怪,例如代理79.110.31.87:8085 我得到{"ip":"162.220.246.230"} 我尝试向whoer.net 提出请求,它显示相同ip
  • @cᴏʟᴅsᴘᴇᴇᴅ 没关系,我设置了系统代理。我删除了它,现在我总是从 python 获取我的 IP 地址而不是代理

标签: python https proxy python-requests


【解决方案1】:

requests指定代理列表时,key为协议,value为domain/ip。对于实际值,您无需再次指定http://https://

所以,您的proxiesDict 将是:

proxiesDict = {
  'http':  proxy_line,
  'https': proxy_line
}

【讨论】:

  • 我遇到了与上面相同的问题,除了用户名:密码代理。您的答案与 Requests 文档不同,后者指定在前面加上“http://”。
  • Requests Err:「代理 URL 没有方案,应该以 http:// 或 https:// 开头」
【解决方案2】:

您还可以通过设置环境变量来配置代理:

$ export HTTP_PROXY="http://proxyIP:PORT"
$ export HTTPS_PROXY="http://proxyIP:PORT"

那么,你只需要在没有代理请求的情况下执行你的python脚本。

另外,您可以使用http://user:password@host 配置您的代理

有关更多信息,请参阅此文档:http://docs.python-requests.org/en/master/user/advanced/

【讨论】:

  • 你好我需要从文件中读取代理,这就是为什么我需要这样配置
【解决方案3】:

尝试使用 pycurl 这个功能可能会有所帮助:

import pycurl

def pycurl_downloader(url, proxy_url, proxy_usr):
    """
    Download files with pycurl
    the proxy configuration:
    proxy_url = 'http://10.0.0.0:3128'
    proxy_usr = 'user:password'
    """

    c = pycurl.Curl()
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.MAXREDIRS, 5)
    c.setopt(pycurl.CONNECTTIMEOUT, 30)
    c.setopt(pycurl.AUTOREFERER, 1)

    if proxy_url: c.setopt(pycurl.PROXY, proxy_url)
    if proxy_usr: c.setopt(pycurl.PROXYUSERPWD, proxy_usr)

    content = StringIO()
    c.setopt(pycurl.URL, url)
    c.setopt(c.WRITEFUNCTION, content.write)

    try:
        c.perform()
        c.close()
    except pycurl.error, error:
        errno, errstr = error
        print 'An error occurred: ', errstr

    return content.getvalue()

【讨论】:

  • 我要试一试
  • 我认为if proxy: 中有拼写错误,即 var 不存在。还有conten.write
猜你喜欢
  • 1970-01-01
  • 2022-07-08
  • 2023-03-22
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多