无法使用 Python 通过 socks5 代理发送请求

Can't send requests through socks5 proxy with Python

我试图通过代理 (socks5) 发送 http/https 请求,但我无法理解问题出在我的代码中还是代理中。

我尝试使用 ,但出现错误:

requests.exceptions.ConnectionError: SOCKSHTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x000001B656AC9608>: Failed to establish a new connection: Connection closed unexpectedly'))

这是我的代码:

import requests

url = "https://www.google.com"


proxies = {
    "http":"socks5://fsagsa:sacesf241_country-darwedafs_session-421dsafsa@x.xxx.xxx.xx:31112",
    "https":"socks5://fsagsa:sacesf241_country-darwedafs_session-421dsafsa@x.xxx.xxx.xx:31112",
    }

headers = {
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "Sec-Gpc": "1",
        "Sec-Fetch-Site": "same-origin",
        "Sec-Fetch-User": "?1",
        "Accept-Encoding": "gzip, deflate, br",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Dest": "document",
        "Accept-Language": "en-GB,en;q=0.9"
    }


r = requests.get(url, headers = headers, proxies = proxies)

print(r)

然后,我用 online tool 检查了代理 该工具设法通过代理发送请求。 .

所以问题出在这段代码中?我不知道哪里出了问题。

编辑 (15/09/2021)

我添加了headers但是问题依旧

创建一个本地 server/mock 以使用 pytest 或其他带有 responses 库的测试框架来处理请求,以消除 application/script 外部的变量。我很确定 Google 会拒绝空 headers 的请求。此外,请确保您安装了正确的依赖项以在请求中启用 SOCKS 代理支持 (python -m pip install requests[socks])。此外,如果您正在发出连接到代理的远程请求,则必须在 proxies 字典中将 socks5 更改为 socks5h

参考资料

pytest: https://docs.pytest.org/en/6.2.x/

回复:https://github.com/getsentry/responses

请求[袜子]:https://docs.python-requests.org/en/master/user/advanced/#socks

除了基本的 HTTP 代理外,Requests 还支持使用 SOCKS 协议的代理。这是一项可选功能,需要在使用前安装额外的第三方库。

您可以从 pip 获取此功能的依赖项:

$ python -m pip install requests[socks]

安装这些依赖项后,使用 SOCKS 代理就像使用 HTTP 代理一样简单:

proxies = {
            'http': 'socks5://user:pass@host:port',
            'https': 'socks5://user:pass@host:port'
          }

使用方案 socks5 会导致 DNS 解析发生在客户端,而不是代理服务器上。这符合curl,它使用scheme来决定是在client还是proxy上做DNS解析。如果要解析代理服务器上的域,请使用 socks5h 作为方案。