Proxies mit dem Python-Modul 'Requests'


159

Nur eine kurze, einfache über die ausgezeichneten Anfragen Moduls für Python.

Ich kann in der Dokumentation anscheinend nicht finden, was die Variable 'Proxies' enthalten sollte. Wenn ich ihm ein Diktat mit einem Standardwert "IP: PORT" sende, wird es abgelehnt und nach 2 Werten gefragt. Also denke ich (weil dies nicht in den Dokumenten behandelt zu werden scheint), dass der erste Wert die IP und der zweite der Port ist?

Die Dokumente erwähnen dies nur:

Proxys - (optional) Wörterbuch-Zuordnungsprotokoll zur URL des Proxys.

Also habe ich es versucht ... was soll ich tun?

proxy = { ip: port}

und sollte ich diese in einen Typ konvertieren, bevor ich sie in das Diktat setze?

r = requests.get(url,headers=headers,proxies=proxy)

Antworten:


279

Die proxiesDiktatsyntax lautet {"protocol":"ip:port", ...}. Damit können Sie verschiedene (oder dieselben) Proxies für Anforderungen mithilfe der Protokolle http , https und ftp angeben :

http_proxy  = "http://10.10.1.10:3128"
https_proxy = "https://10.10.1.11:1080"
ftp_proxy   = "ftp://10.10.1.10:3128"

proxyDict = { 
              "http"  : http_proxy, 
              "https" : https_proxy, 
              "ftp"   : ftp_proxy
            }

r = requests.get(url, headers=headers, proxies=proxyDict)

Aus der requestsDokumentation abgeleitet :

Parameter:
method - Methode für das neue Request-Objekt.
url- URL für das neue Anforderungsobjekt.
...
proxies- (optional) Wörterbuch - Mapping - Protokoll auf die URL des Proxy .
...


Unter Linux können Sie tun dies auch über die HTTP_PROXY, HTTPS_PROXYund FTP_PROXYUmgebungsvariablen:

export HTTP_PROXY=10.10.1.10:3128
export HTTPS_PROXY=10.10.1.11:1080
export FTP_PROXY=10.10.1.10:3128

Unter Windows:

set http_proxy=10.10.1.10:3128
set https_proxy=10.10.1.11:1080
set ftp_proxy=10.10.1.10:3128

Vielen Dank, Jay, dass Sie darauf hingewiesen haben:
Die Syntax hat sich mit den Anforderungen 2.0.0 geändert .
Sie müssen der URL ein Schema hinzufügen: https://2.python-requests.org/en/latest/user/advanced/#proxies


@cigar Ich wusste es, weil urllib2 genau das gleiche Format für das Proxy-Diktat verwendet und als ich docs.python-requests.org/en/latest/api/#module-requests sah, sagte "Proxies - (optional) Dictionary Mapping Protocol to the URL des Proxys. ", Wusste ich sofort.
Chown

1
ahhh ich verstehe, nie Proxies mit urllib2 verwendet wegen des Ratschlags, es von hier zu entfernen, ersetzt 2 Seiten Code durch 8 Zeilen: / re: Schulter :))) toller Aufenthalt hier, Sie haben mir bereits Stunden in gespart gesamt! Wenn du jemals Hilfe bei der Musik brauchst, gib mir einen Schrei, zu dem ich Ratschläge geben kann, sonst kann ich mir keine andere Möglichkeit vorstellen, als massiven Dank oder eine Tasse Tee zurückzuzahlen!

Es scheint, dass Anfragen und darüber hinaus urllib3 bei Verwendung eines Proxys keine VERBINDUNG durchführen können :(
dzen

@dzen Ich habe noch nicht verwendet, urllib3also muss ich das untersuchen. Danke für die Warnung.
Chown

3
@chown Die Syntax wurde mit den Anforderungen 2.0.0 geändert. Sie müssen der URL ein Schema hinzufügen: docs.python-requests.org/en/latest/user/advanced/#proxies Es wäre schön, wenn Sie dies zu Ihrer Antwort hier hinzufügen könnten
Jay

28

Ich habe festgestellt, dass urllib einen wirklich guten Code hat, um die Proxy-Einstellungen des Systems abzurufen, und sie sind zufällig in der richtigen Form, um sie direkt zu verwenden. Sie können dies wie folgt verwenden:

import urllib

...
r = requests.get('http://example.org', proxies=urllib.request.getproxies())

Es funktioniert sehr gut und urllib weiß auch, wie man Mac OS X- und Windows-Einstellungen erhält.


Funktioniert es ohne Proxy? Einige unserer Benutzer haben keinen Proxy und andere.
Jonasl

1
Enthält es no_proxy und respektieren Anfragen no_proxy?
Trotzdem

4
Fehler bekommen:module 'urllib' has no attribute 'getproxies'
Zahra

4
Grünlich: urllib.request.getproxies ()
oliche

1
@ Zahra versuchen urllib2.getproxies ()
rleelr

25

Hier können Sie auf die Proxy-Dokumentation verweisen .

Wenn Sie einen Proxy verwenden müssen, können Sie einzelne Anforderungen mit dem Proxy-Argument für eine beliebige Anforderungsmethode konfigurieren:

import requests

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "https://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

Verwenden Sie die Syntax http: // user: password@host.com/, um HTTP Basic Auth mit Ihrem Proxy zu verwenden :

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/"
}

17

Die akzeptierte Antwort war ein guter Anfang für mich, aber ich bekam immer wieder den folgenden Fehler:

AssertionError: Not supported proxy scheme None

Um dies zu beheben, wurde das http: // in der Proxy-URL folgendermaßen angegeben:

http_proxy  = "http://194.62.145.248:8080"
https_proxy  = "https://194.62.145.248:8080"
ftp_proxy   = "10.10.1.10:3128"

proxyDict = {
              "http"  : http_proxy,
              "https" : https_proxy,
              "ftp"   : ftp_proxy
            }

Es würde mich interessieren, warum das Original für einige Leute funktioniert, aber nicht für mich.

Bearbeiten: Ich sehe, dass die Hauptantwort jetzt aktualisiert wird, um dies widerzuspiegeln :)


4
geändert mit 2.0.0: Proxy-URLs müssen jetzt ein explizites Schema haben. Eine MissingSchema-Ausnahme wird ausgelöst, wenn dies nicht der Fall ist.
Jay

4

Wenn Sie Cookies und Sitzungsdaten beibehalten möchten, tun Sie dies am besten folgendermaßen:

import requests

proxies = {
    'http': 'http://user:pass@10.10.1.0:3128',
    'https': 'https://user:pass@10.10.1.0:3128',
}

# Create the session and set the proxies.
s = requests.Session()
s.proxies = proxies

# Make the HTTP request through the session.
r = s.get('http://www.showmemyip.com/')

2

8 Jahre zu spät. Aber ich mag:

import os
import requests

os.environ['HTTP_PROXY'] = os.environ['http_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['HTTPS_PROXY'] = os.environ['https_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['NO_PROXY'] = os.environ['no_proxy'] = '127.0.0.1,localhost,.local'

r = requests.get('https://example.com')  # , verify=False

1

Hier ist meine Grundklasse in Python für das Anforderungsmodul mit einigen Proxy-Konfigurationen und Stoppuhr!

import requests
import time
class BaseCheck():
    def __init__(self, url):
        self.http_proxy  = "http://user:pw@proxy:8080"
        self.https_proxy = "http://user:pw@proxy:8080"
        self.ftp_proxy   = "http://user:pw@proxy:8080"
        self.proxyDict = {
                      "http"  : self.http_proxy,
                      "https" : self.https_proxy,
                      "ftp"   : self.ftp_proxy
                    }
        self.url = url
        def makearr(tsteps):
            global stemps
            global steps
            stemps = {}
            for step in tsteps:
                stemps[step] = { 'start': 0, 'end': 0 }
            steps = tsteps
        makearr(['init','check'])
        def starttime(typ = ""):
            for stemp in stemps:
                if typ == "":
                    stemps[stemp]['start'] = time.time()
                else:
                    stemps[stemp][typ] = time.time()
        starttime()
    def __str__(self):
        return str(self.url)
    def getrequests(self):
        g=requests.get(self.url,proxies=self.proxyDict)
        print g.status_code
        print g.content
        print self.url
        stemps['init']['end'] = time.time()
        #print stemps['init']['end'] - stemps['init']['start']
        x= stemps['init']['end'] - stemps['init']['start']
        print x


test=BaseCheck(url='http://google.com')
test.getrequests()

1

Ich habe gerade einen Proxy-Graber erstellt und kann mich auch ohne Eingabe mit demselben Proxy-Graby verbinden.

#Import Modules

from termcolor import colored
from selenium import webdriver
import requests
import os
import sys
import time

#Proxy Grab

options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.sslproxies.org/")
tbody = driver.find_element_by_tag_name("tbody")
cell = tbody.find_elements_by_tag_name("tr")
for column in cell:

        column = column.text.split(" ")
        print(colored(column[0]+":"+column[1],'yellow'))
driver.quit()
print("")

os.system('clear')
os.system('cls')

#Proxy Connection

print(colored('Getting Proxies from graber...','green'))
time.sleep(2)
os.system('clear')
os.system('cls')
proxy = {"http": "http://"+ column[0]+":"+column[1]}
url = 'https://mobile.facebook.com/login'
r = requests.get(url,  proxies=proxy)
print("")
print(colored('Connecting using proxy' ,'green'))
print("")
sts = r.status_code

0

Es ist etwas spät, aber hier ist eine Wrapper-Klasse, die das Scraping von Proxys und das anschließende Erstellen eines http-POST oder GET vereinfacht:

ProxyRequests

https://github.com/rootVIII/proxy_requests

0

Ich teile Code zum Abrufen von Proxys von der Website "https://free-proxy-list.net" und speichere Daten in einer Datei, die mit Tools wie "Elite Proxy Switcher" kompatibel ist (Format IP: PORT):

## PROXY_UPDATER - Holen Sie sich kostenlose Proxys von https://free-proxy-list.net/

from lxml.html import fromstring
import requests
from itertools import cycle
import traceback
import re

######################FIND PROXIES#########################################
def get_proxies():
    url = 'https://free-proxy-list.net/'
    response = requests.get(url)
    parser = fromstring(response.text)
    proxies = set()
    for i in parser.xpath('//tbody/tr')[:299]:   #299 proxies max
        proxy = ":".join([i.xpath('.//td[1]/text()') 
        [0],i.xpath('.//td[2]/text()')[0]])
        proxies.add(proxy)
    return proxies



######################write to file in format   IP:PORT######################
try:
    proxies = get_proxies()
    f=open('proxy_list.txt','w')
    for proxy in proxies:
        f.write(proxy+'\n')
    f.close()
    print ("DONE")
except:
    print ("MAJOR ERROR")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.