कैसे मोजे प्रॉक्सी के माध्यम से अजगर अनुरोध काम करने के लिए


83

मैं अपने पायथन लिपि में महान अनुरोध पुस्तकालय का उपयोग कर रहा हूं :

import requests
r = requests.get("some-site.com")
print r.text

मैं मोजे प्रॉक्सी का उपयोग करना चाहूंगा। लेकिन अनुरोध केवल HTTP प्रॉक्सी का समर्थन करता है।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


116

आधुनिक तरीका:

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

3
खबरदार, जब एक SOCKS प्रॉक्सी का उपयोग करते हैं, तो HTTP पूर्ण अनुरोध के साथ HTTP अनुरोध करेगा (उदाहरण के लिए, "GET / HTTP / 1.1" के बजाय "GET example.com HTTP / 1.1") और इस व्यवहार के कारण समस्याएँ हो सकती हैं। अफसोस की बात है कि ऐसा लगता है कि अब कोई बेहतर समाधान उपलब्ध नहीं है।
a3nm

इसके अतिरिक्त, मुझे प्रॉक्सी सेटिंग्स में उपयोगकर्ता नाम और पासवर्ड का उपयोग करने का कोई तरीका नहीं मिला है। Urllib2 का सहारा लेना पड़ा।
शामिल करें

9
मैं zsh का उपयोग कर रहा हूं और मुझे bash -c "pip install -U requests[socks]"इसके बजाय करना होगा अन्यथा zsh शिकायत करेगा zsh: no matches found: requests[socks]
ब्रूस सन

3
विंडोज पर आपको भी आवश्यकता है:
पाइप इन

4
@ ब्रूससून pip install 'requests[socks]'पर्याप्त होगा
बकाटौरबल

55

requestsसंस्करण के रूप में 2.10.0 , 2016-04-29 को जारी किया गया, requestsSOCKS का समर्थन करता है।

यह जरूरी है PySocks , जिसके साथ स्थापित किया जा सकता pip install pysocks

उदाहरण का उपयोग:

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

3
pip install -U requests[socks] is enogh
DVska

8
मेरे मामले में, पाइप स्थापित -U अनुरोध [मोजे] अकेले काम नहीं करता है। पाइप स्थापित pysocks एक चाहिए है।
डेनमार्क

इसमें संशोधन करने के लिए, कि SOCKS (> 2.10.0) requestsका समर्थन करने वाले संस्करण के अपने संस्करण के एक मैनुअल अपग्रेड को मजबूर करने के लिए , पाइप चलाएं: (इस लिखने के समय 2.18.4), लेकिन जांच करें: pypi। नवीनतम संस्करण के लिए python.org/pypi/requests (यह पृष्ठ आपको शीर्ष शीर्षलेख में दिखाना चाहिए कि नवीनतम स्थिर क्रिया क्या है)। pip install requests==2.18.4
ntk4

मैं इस पर @DenMark के साथ हूं। मेरा काम लैपटॉप एक मैक है और अनुरोध करता है [मोजे] सिर्फ मेरे लिए स्थापित करने से किसी भी तरह से इनकार नहीं किया है कि मैंने क्या कोशिश की ... जादुई तरीके से सब कुछ तय किया।
जेरेमी लोगन

मेरे मामले में देखते हैं socksके साथ मॉड्यूल का नाम संघर्ष qBittorrent, मैं हटाने की जरूरत है / ले जाने ~/.local/share/data/qBittorrent/nova3/socks.pyऔर उस हटाने socks.pyc, त्रुटि संदेश को हल करने के module 'socks' has no attribute 'create_connection'लिए और bad magic number in 'socks':क्रमशः।
फल

45

यदि किसी ने इन सभी पुराने उत्तरों की कोशिश की है, और अभी भी समस्याओं में चल रहा है:

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(यह hostname संकल्प के लिए खड़ा है)।

PySocks पैकेज मॉड्यूल डिफ़ॉल्ट दूरस्थ रिज़ॉल्यूशन करने के लिए है , और मुझे यकीन नहीं है कि अनुरोधों ने उनके एकीकरण को इस अस्पष्ट रूप से भिन्न क्यों बनाया , लेकिन यहां हम हैं।


6
यह वास्तव में मेरा मुद्दा था! धन्यवाद!
xbeta

4
यह मेरे लिए सटीक मुद्दा था। यह प्रॉक्सी के माध्यम से DNS प्रश्न नहीं कर रहा था। जैसे ही मैंने एच जोड़ा, सब कुछ ठीक से काम किया।
jamescampbell

1
धन्यवाद, socks5hदृष्टिकोण है तो बंदर-पैच वर्क अराउंड मैं चिंतित था कि मैंने पहले कर दिया था की तुलना में बहुत क्लीनर।
दरियाई

1
बहुत अच्छा। मैं socks5h://प्रॉक्सी पर पायथन प्रलेखन के लिए कहीं भी नहीं मिला । गलत जगह देख रहा होगा। होगा प्यार तो।
Ligemer

1
@ लाइगरमर कभी-कभी देखने के लिए एकमात्र सही जगह कोड होता है। (लेकिन कोड को देखते हुए, StackOverflow को अपडेट करें, और अब देखने के लिए दो सही स्थान हैं :))
महमूद हशमी

18

आपको 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)

महान! यह सुविधाजनक है जब मैं मोजे के माध्यम से एक पैकेज (जैसे फ़्लिकरपी) का उपयोग करना चाहता हूं 5 प्रॉक्सी
MZD

2
यह मोज़े प्रॉक्सी का उपयोग करने का एक अच्छा तरीका नहीं है, क्योंकि यह डिफ़ॉल्ट सॉकेट को बदल देता है और कुछ गलती करेगा, इसलिए यदि बस परीक्षण करें तो यह ठीक होगा, लेकिन वास्तविक चीजों के लिए नहीं।
lqhcpsgbl

6

जैसे ही अजगर 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 प्रॉक्सी समर्थन देखें

एक अन्य विकल्प, यदि आप requestतैयार होने की प्रतीक्षा नहीं कर सकते हैं , जब आप उपयोग नहीं कर सकते हैं requesocks- जैसे कि pwdअंतर्निहित मॉड्यूल की कमी के कारण GoogleAppEngine पर , उपरोक्त वर्णित PySocks का उपयोग करना है:

  1. socks.pyरेपो से फ़ाइल को पकड़ो और अपने रूट फ़ोल्डर में एक कॉपी रखो;
  2. जोड़ें import socksऔरimport 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()

2
# 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"
}

4
क्या यह नवीनतम अनुरोध संस्करण में काम करता है? बिना requesocks?
Gtx

यह proxiesनवीनतम requestsपुल अनुरोध के लिए शब्दकोश है , कि इस समय पहले से ही विलय नहीं किया गया था। @ वे - github.com/kennethreitz/requests/pull/2953
loretoparisi

2

मैंने इस तरह से pysocks और बंदर को create_connection को urllib3 में स्थापित किया:

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

0

शायद यह मदद कर सकता है:

https://github.com/kennethreitz/requests/pull/478


2
चर्चा धागा यह दिखाने के लिए लगता है कि वे SOCKS समर्थन को urllib3 और फिर अनुरोधों में एकीकृत करना चाहते हैं। अब तक, github.com/shazow/urllib3/pull/68 अभी भी खुला है।
डेविड ज़िया

मुद्दा github.com/shazow/urllib3/pull/68 अब बंद हो गया है (लेकिन मैंने जांच नहीं की कि क्या यह वास्तव में है)।
जनवरी Vlcinsky

0

मैं लिनक्स पर ऐसा कर सकता था।

$ pip3 install --user 'requests[socks]'
$ https_proxy=socks5://<hostname or ip>:<port> python3 -c \
> 'import requests;print(requests.get("https://httpbin.org/ip").text)'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.