Używam wspaniałej biblioteki Requests w moim skrypcie Python:
import requests
r = requests.get("some-site.com")
print r.text
Chciałbym używać proxy skarpet. Ale Requests obsługuje teraz tylko proxy HTTP.
Jak mogę to zrobić?
python
proxy
socks
python-requests
lithuak
źródło
źródło
bash -c "pip install -U requests[socks]"
przeciwnym razie zsh będzie narzekaćzsh: no matches found: requests[socks]
.pip install 'requests[socks]'
wystarczyłobyOd
requests
wersji 2.10.0 , wydanej 29.04.2016,requests
obsługuje SOCKS.Wymaga PySocks , które można zainstalować z
pip install pysocks
.Przykładowe użycie:
import requests proxies = {'http': "socks5://myproxy:9191"} requests.get('http://example.org', proxies=proxies)
źródło
pip install -U requests[socks]
jestrequests
do wersji obsługującej SOCKS (> 2.10.0), uruchom pip:pip install requests==2.18.4
(2.18.4 w momencie pisania tego), ale sprawdź: pypi. python.org/pypi/requests dla najnowszej wersji (ta strona powinna pokazać w górnym nagłówku, jaka jest najnowsza stabilna wersja).socks
konflikt nazwy modułu zqBittorrent
, potrzebuję usunąć / przenieść~/.local/share/data/qBittorrent/nova3/socks.py
i usunąć tosocks.pyc
, aby rozwiązać komunikat o błędziemodule 'socks' has no attribute 'create_connection'
ibad magic number in 'socks':
odpowiednio.Na wypadek, gdyby ktoś wypróbował wszystkie te starsze odpowiedzi i nadal ma problemy, takie jak:
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',))
Może tak być, ponieważ domyślnie
requests
jest skonfigurowany do rozwiązywania zapytań DNS po lokalnej stronie połączenia.Spróbuj zmienić adres URL serwera proxy z
socks5://proxyhost:1234
nasocks5h://proxyhost:1234
. Zwróć uwagę na dodatkoweh
(oznacza to rozpoznawanie nazwy hosta).Domyślnie moduł pakietu PySocks wykonuje zdalne rozwiązywanie problemów i nie jestem pewien, dlaczego żądania spowodowały, że ich integracja była tak niewyraźnie rozbieżna, ale oto jesteśmy.
źródło
socks5h
podejście jest o wiele czystsze niż obejście polegające na łataniu małp, które wcześniej martwiłem się, że będę musiał zrobić.socks5h://
nigdzie znaleźć dokumentacji Pythona na serwerach proxy. Musiał szukać w niewłaściwych miejscach. Tak kocham.Musisz zainstalować pysocks , moja wersja to 1.0, a kod działa dla mnie:
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)
źródło
Jak tylko Python
requests
zostanie scalony zSOCKS5
żądaniem ściągnięcia, będzie to tak proste, jak użycieproxies
słownika:#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)
Zobacz Obsługa proxy SOCKS
Inną opcją, w przypadku gdy nie możesz się doczekać,
request
aż będziesz gotowy, gdy nie możesz używaćrequesocks
- jak w GoogleAppEngine z powodu brakupwd
wbudowanego modułu, jest użycie PySocks, o którym mowa powyżej:socks.py
plik z repozytorium i umieść kopię w folderze głównym;import socks
iimport socket
W tym momencie skonfiguruj i powiąż gniazdo przed użyciem with
urllib2
- w następującym przykładzie: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()
źródło
# 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" }
źródło
requesocks
?proxies
słownik dla ostatniegorequests
żądania ściągnięcia, które w tym czasie nie zostało już scalone. @see - github.com/kennethreitz/requests/pull/2953Zainstalowałem pysocks i małpa załatałem create_connection w urllib3, na przykład:
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
źródło
Może to pomoże:
https://github.com/kennethreitz/requests/pull/478
źródło
Mógłbym to zrobić na Linuksie.
$ pip3 install --user 'requests[socks]' $ https_proxy=socks5://<hostname or ip>:<port> python3 -c \ > 'import requests;print(requests.get("https://httpbin.org/ip").text)'
źródło