如何让python请求通过SOCKS代理工作

9q78igpj  于 2022-12-02  发布在  Python
关注(0)|答案(9)|浏览(197)

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

import requests
r = requests.get("http://example.com")
print(r.text)

我想使用SOCKS代理,我该怎么做?请求似乎只支持HTTP代理。

bqf10yzr

bqf10yzr1#

现代道:

pip install -U requests[socks]

然后

import requests

resp = requests.get('http://go.to', 
                    proxies=dict(http='socks5://user:pass@host:port',
                                 https='socks5://user:pass@host:port'))
dojqjjoe

dojqjjoe2#

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

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',))

这可能是因为,默认情况下,requests配置为在连接的 * 本地 * 端解析DNS查询。
尝试将您的代理URL从socks5://proxyhost:1234更改为socks5h://proxyhost:1234。请注意额外的h(它代表主机名解析)。
PySocks包模块默认是进行远程解析,我不知道为什么请求使它们的集成变得如此模糊,但我们在这里。

00jrzges

00jrzges3#

从2016年4月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)
3qpi33ja

3qpi33ja4#

您需要安装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)
xv8emn3q

xv8emn3q5#

一旦python requestsSOCKS5 pull请求合并,它将像使用proxies字典一样简单:
更新:PR已合并。

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

        #headers
        headers = {

        }

        url='http://example.com/'
        res = requests.get(url, headers=headers, proxies=proxies)

请参阅SOCKS Proxy Support
另一个选择是,如果你不能等待request准备好,当你不能使用requesocks- like在GoogleAppEngine上,由于缺乏pwd内置模块,是使用PySocks,上面提到的:
1.从存储库中获取socks.py文件,并将副本放在根文件夹中;
1.将import socksimport socket相加
此时,请在使用urllib2之前配置并绑定套接字-在以下示例中:

import urllib2
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "myprivateproxy.example",port=9050)
socket.socket = socks.socksocket
res=urllib2.urlopen(url).read()
cclgggtu

cclgggtu6#

您可以使用https_proxy环境变量运行脚本。
1.必要时安装保护套支架。

pip install PySocks
pip install pysocks5

1.安装程序环境变量

export https_proxy=socks5://<hostname or ip>:<port>

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)'
qmelpv7a

qmelpv7a7#

# SOCKS5 proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "socks5://1.2.3.4:1080",
    'https' : "socks5://1.2.3.4:1080"
}

# SOCKS4 proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "socks4://1.2.3.4:1080",
    'https' : "socks4://1.2.3.4:1080"
}

# HTTP proxy for HTTP/HTTPS
proxiesDict = {
    'http' : "1.2.3.4:1080",
    'https' : "1.2.3.4:1080"
}
mftmpeh8

mftmpeh88#

我在urllib3中安装了pysocks和monkey补丁create_connection,如下所示:

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 1080)

def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                      source_address=None, socket_options=None):
    """Connect to *address* and return the socket object.

    Convenience function.  Connect to *address* (a 2-tuple ``(host,
    port)``) and return the socket object.  Passing the optional
    *timeout* parameter will set the timeout on the socket instance
    before attempting to connect.  If no *timeout* is supplied, the
    global default timeout setting returned by :func:`getdefaulttimeout`
    is used.  If *source_address* is set it must be a tuple of (host, port)
    for the socket to bind as a source address before making the connection.
    An host of '' or port 0 tells the OS to use the default.
    """

    host, port = address
    if host.startswith('['):
        host = host.strip('[]')
    err = None
    for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
        af, socktype, proto, canonname, sa = res
        sock = None
        try:
            sock = socks.socksocket(af, socktype, proto)

            # If provided, set socket level options before connecting.
            # This is the only addition urllib3 makes to this function.
            urllib3.util.connection._set_socket_options(sock, socket_options)

            if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
                sock.settimeout(timeout)
            if source_address:
                sock.bind(source_address)
            sock.connect(sa)
            return sock

        except socket.error as e:
            err = e
            if sock is not None:
                sock.close()
                sock = None

    if err is not None:
        raise err

    raise socket.error("getaddrinfo returns an empty list")

# monkeypatch
urllib3.util.connection.create_connection = create_connection
gupuwyp2

gupuwyp29#

我可以在Linux上做这个。

$ pip3 install --user 'requests[socks]'
$ https_proxy=socks5://<hostname or ip>:<port> python3 -c \
> 'import requests;print(requests.get("https://httpbin.org/ip").text)'

相关问题