Python 스크립트에서 훌륭한 Requests 라이브러리를 사용하고 있습니다.
import requests
r = requests.get("some-site.com")
print r.text
양말 프록시를 사용하고 싶습니다. 그러나 요청은 현재 HTTP 프록시 만 지원합니다.
어떻게 할 수 있습니까?
답변
현대적인 방법 :
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'))
답변
답변
누군가가 이러한 모든 이전 답변을 시도했지만 여전히 다음과 같은 문제가 발생하는 경우 :
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 패키지 모듈 기본값은 원격 해결을 수행하는 것이며 요청이 통합을 이렇게 모호하게 분산 시킨 이유는 모르겠지만 여기에 있습니다.
답변
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)
답변
파이썬 requests
이 SOCKS5
풀 리퀘스트 와 병합 되 자마자 proxies
딕셔너리 를 사용하는 것처럼 간단 합니다 :
#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)
SOCKS 프록시 지원 참조
기본 제공 모듈 이 없어 GoogleAppEngine에서와 같이 request
사용할 수 없을 때 준비가 될 때까지 기다릴 수없는 경우를 대비 requesocks
하여 위에서 언급 한 PySockpwd
을 사용 하는 방법도 있습니다.
socks.py
저장소 에서 파일을 가져 와서 루트 폴더에 사본을 넣으십시오.- 추가
import socks
및import socket
이 시점 urllib2
에서 with를 사용하기 전에 다음 예에서 소켓을 구성하고 바인딩합니다 .
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()
답변
# 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"
}
답변
다음과 같이 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