无法使用 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 作为方案。
我试图通过代理 (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 作为方案。