如何通过socks代理使python请求工作

izh*_*hak 61 python proxy socks python-requests

我在我的Python脚本中使用了很棒的Requests库:

import requests
r = requests.get("some-site.com")
print r.text
Run Code Online (Sandbox Code Playgroud)

我想用socks代理.但是Requests现在只支持HTTP代理.

我怎样才能做到这一点?

dvs*_*ska 92

现代方式:

pip install -U requests[socks]
Run Code Online (Sandbox Code Playgroud)

然后

import requests

resp = requests.get('http://go.to', 
                    proxies=dict(http='socks5://user:pass@host:port',
                                 https='socks5://user:pass@host:port'))
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用zsh而且我必须做`bash -c"pip install -U requests [socks]"`否则zsh会抱怨`zsh:找不到匹配项:requests [socks]`. (7认同)
  • @BruceSun`pip install'requests [socks]'`就足够了 (3认同)
  • 我需要在袜子 URL 中添加一个“h”:“socks5h://localhost:8080”,因为我这边无法解析主机名。从 https://github.com/urllib3/urllib3/issues/1035 来看,“h”似乎告诉库服务器将是解析主机名的服务器。 (3认同)
  • 当心,当使用SOCKS代理时,重新请求将使用完整URL发出HTTP请求(例如,“ GET http://example.com/ HTTP / 1.1”而不是“ GET / HTTP / 1.1”),此行为可能会导致问题。可悲的是,似乎目前没有更好的解决方案。 (2认同)
  • 在Windows上,您还需要:pip install win-inet-pton (2认同)
  • 您好,值得注意的是 `requests[socks]` 会安装 `PySocks` 本身。这可以在 `requests` 本身的 `setup.py` 中看到 - `'socks': ['PySocks>=1.5.6, !=1.5.7']`。所以两个答案是正确的 - 你的和@Jim (2认同)

小智 43

自2016-04-29发布的requests版本2.10.0起,requests支持SOCKS.

它需要PySocks,可以安装pip install pysocks.

用法示例:

import requests
proxies = {'http': "socks5://myproxy:9191"}
requests.get('http://example.org', proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

  • 就我的情况而言,单独的pip install -U请求[socks]不起作用.pip install pysocks是必须的. (7认同)
  • `pip install -U requests [socks]`是enogh (3认同)

Mah*_*emi 33

如果有人尝试了所有这些较旧的答案,并且仍然遇到如下问题:

requests.exceptions.ConnectionError: 
   SOCKSHTTPConnectionPool(host='myhost', port=80): 
   Max retries exceeded with url: /my/path 
   (Caused by NewConnectionError('<requests.packages.urllib3.contrib.socks.SOCKSConnection object at 0x106812bd0>: 
   Failed to establish a new connection: 
   [Errno 8] nodename nor servname provided, or not known',))
Run Code Online (Sandbox Code Playgroud)

这可能是因为默认情况下,requests配置为解析连接本地端的DNS查询.

尝试将代理网址从更改socks5://proxyhost:1234socks5h://proxyhost:1234.请注意额外的h(它代表主机名解析).

PySocks包模块的默认设置是进行远程解决,我不确定为什么请求使它们的集成变得模糊不清,但我们就是这样.

  • 这正是我的问题!谢谢! (4认同)
  • 这对我来说是确切的问题。它没有通过代理进行DNS查询。当我添加h时,一切正常。 (2认同)
  • 谢谢,`socks5h` 方法比我之前担心必须做的猴子补丁解决方法更干净。 (2认同)

lqh*_*gbl 15

你需要安装pysocks,我的版本是1.0,代码适合我:

import socket
import socks
import requests
ip='localhost' # change your proxy's ip
port = 0000 # change your proxy's port
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, ip, port)
socket.socket = socks.socksocket
url = u'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=inurl%E8%A2%8B'
print(requests.get(url).text)
Run Code Online (Sandbox Code Playgroud)

  • 使用socks代理不是一个好方法,因为它改变了默认的socket,会犯一些错误,所以如果只是测试就可以了,但不适用于真实的东西。 (2认同)

Ser*_*nov 7

您可以使用环境变量运行脚本https_proxy

  1. 如有必要,安装袜子支架。
pip install PySocks
pip install pysocks5
Run Code Online (Sandbox Code Playgroud)
  1. 设置环境变量
export https_proxy=socks5://<hostname or ip>:<port>
Run Code Online (Sandbox Code Playgroud)
  1. 运行你的脚本。此示例使用代理发出请求并显示 IP 地址:
echo Your real IP
python -c 'import requests;print(requests.get("http://ipinfo.io/ip").text)'

echo IP with socks-proxy
python -c 'import requests;print(requests.get("https://ipinfo.io/ip").text)'
Run Code Online (Sandbox Code Playgroud)


lor*_*isi 5

一旦python requests将与SOCKS5pull request 合并,它将像使用proxiesdictionary 一样简单:

#proxy
        # SOCKS5 proxy for HTTP/HTTPS
        proxies = {
            'http' : "socks5://myproxy:9191",
            'https' : "socks5://myproxy:9191"
        }

        #headers
        headers = {

        }

        url='http://icanhazip.com/'
        res = requests.get(url, headers=headers, proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

请参阅SOCKS代理支持

如果您无法等待request准备就绪requesocks而又无法使用时(例如由于缺少pwd内置模块而在GoogleAppEngine上),另一种选择是使用上面提到的PySocks

  1. socks.py从仓库中获取文件,并将副本放入您的根文件夹中;
  2. import socksimport socket

urllib2下面的示例中,在与- 结合使用之前,请先配置并绑定套接字:

import urllib2
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "myprivateproxy.net",port=9050)
socket.socket = socks.socksocket
res=urllib2.urlopen(url).read()
Run Code Online (Sandbox Code Playgroud)