试试这个:
import requests
import requests_proxychain
requests_proxychain.patch()
r = requests.get(
'https://httpbin.org/get',
proxies={'all': 'http://10.10.1.10:3128,socks5://90.90.90.90:8080'}
)
print(r.text)
requests_proxychain.py
'''
requirements:
python_socks
async_timeout
usage:
import requests
import requests_proxychain
requests_proxychain.patch()
requests.get(
'https://httpbin.org/get',
proxies={'all': 'socks5://127.0.0.1:1080,http://127.0.0.2:1080'}
)
tested:
requests/2.8.0 + python/3.6.15
requests/2.27.1 + python/3.10.2
'''
import asyncio
from requests.utils import select_proxy
from requests.adapters import HTTPAdapter
from python_socks.async_.asyncio import Proxy
from python_socks.async_ import ProxyChain
try:
import requests.packages.urllib3 as urllib3
except ImportError: # requests >= v2.16.0
import urllib3
HTTPConnection = urllib3.connection.HTTPConnection
HTTPSConnection = urllib3.connection.HTTPSConnection
HTTPConnectionPool = urllib3.connectionpool.HTTPConnectionPool
HTTPSConnectionPool = urllib3.connectionpool.HTTPSConnectionPool
PoolManager = urllib3.PoolManager
real_get_connection = HTTPAdapter.get_connection
def patch():
HTTPAdapter.get_connection = patched_get_connection
def proxy_from_url(url: str):
for scheme in 'socks4', 'socks5':
scheme_rdns = scheme + 'h'
if url.startswith(scheme_rdns):
url = url.replace(scheme_rdns, scheme, 1)
return Proxy.from_url(url, rdns=True)
return Proxy.from_url(url)
def parse_proxychain_url(url):
proxy = map(str.strip, url.split(','))
proxy = filter(None, proxy)
proxy = list(map(proxy_from_url, proxy))
return ProxyChain(proxy)
class ChainConnection(HTTPConnection):
def __init__(self, *args, **kwargs):
self._socks_options = kwargs.pop('_socks_options')
super().__init__(*args, **kwargs)
def _new_conn(self):
proxy = self._socks_options['proxychain']
loop = asyncio.get_event_loop()
conn = loop.run_until_complete(
proxy.connect(self.host, self.port))
conn.setblocking(True)
return conn
class ChainHTTPSConnection(ChainConnection, HTTPSConnection):
pass
class ChainHTTPConnectionPool(HTTPConnectionPool):
ConnectionCls = ChainConnection
class ChainHTTPSConnectionPool(HTTPSConnectionPool):
ConnectionCls = ChainHTTPSConnection
class ProxyChainManager(PoolManager):
pool_classes_by_scheme = {
'http': ChainHTTPConnectionPool,
'https': ChainHTTPSConnectionPool,
}
def __init__(self, proxy_url, num_pools, **connection_pool_kw):
proxy = parse_proxychain_url(proxy_url)
connection_pool_kw['_socks_options'] = dict(proxychain=proxy)
super().__init__(num_pools, None, **connection_pool_kw)
self.pool_classes_by_scheme = __class__.pool_classes_by_scheme
def patched_get_connection(self, url, proxies):
proxy = select_proxy(url, proxies)
is_proxychain = proxy and ',' in proxy
if not is_proxychain:
return real_get_connection(self, url, proxies)
manager = self.proxy_manager.get(proxy)
if manager is None:
manager = ProxyChainManager(
proxy,
num_pools=self._pool_connections,
maxsize=self._pool_maxsize,
block=self._pool_block,
)
self.proxy_manager[proxy] = manager
return manager.connection_from_url(url)