Proxies avec module 'Requests' Python


159

Juste un court et simple sur l'excellent module Requests pour Python.

Je n'arrive pas à trouver dans la documentation ce que la variable «proxies» devrait contenir. Quand je lui envoie un dict avec une valeur standard "IP: PORT", il l'a rejeté en demandant 2 valeurs. Donc, je suppose (parce que cela ne semble pas être couvert dans la documentation) que la première valeur est l'ip et la seconde le port?

Les documents mentionnent uniquement ceci:

proxies - (facultatif) Protocole de mappage du dictionnaire vers l'URL du proxy.

Alors j'ai essayé ça ... que dois-je faire?

proxy = { ip: port}

et devrais-je les convertir en un certain type avant de les mettre dans le dict?

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

Réponses:


281

La proxiessyntaxe 'dict est {"protocol":"ip:port", ...}. Avec lui, vous pouvez spécifier différents (ou les mêmes) proxie (s) pour les demandes utilisant les protocoles http , https et ftp :

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)

Déduit de la requestsdocumentation :

Paramètres:
method - méthode pour le nouvel objet Request.
url- URL du nouvel objet Request.
...
proxies- (facultatif) Protocole de mappage du dictionnaire vers l' URL du proxy . ...


Sur Linux , vous pouvez également le faire via les HTTP_PROXY, HTTPS_PROXYet les FTP_PROXYvariables d' environnement:

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

Sous 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

Merci Jay d'avoir signalé ceci:
La syntaxe a changé avec les requêtes 2.0.0 .
Vous devrez ajouter un schéma à l'url: https://2.python-requests.org/en/latest/user/advanced/#proxies


@cigar Je le savais parce que urllib2 utilise exactement le même format pour leurs proxies dict, et quand j'ai vu docs.python-requests.org/en/latest/api/#module-requests dire "proxies - (facultatif) Dictionary mapping protocol to the URL du proxy. ", Je l'ai su tout de suite.
chown

1
ahhh je vois, jamais utilisé de proxy avec urllib2 à cause du conseil de s'en débarrasser obtenu d'ici, remplacé 2 pages de code par 8 lignes: / re: épaule :))) super séjour ici, vous m'avez déjà fait gagner des heures total! Si jamais vous avez besoin d'aide avec la musique, donnez-moi un cri, sur lequel je peux donner des conseils, sinon je ne peux pas penser à un moyen de rembourser autre que des remerciements massifs ou des tasses de thé!

Il semble que les demandes et de plus urllib3 ne puisse pas faire de CONNECT lors de l'utilisation d'un proxy :(
dzen

@dzen je ne l'ai pas encore utilisé urllib3donc je vais devoir me pencher là- dessus . Merci pour l'information.
chown

3
@chown la syntaxe a été modifiée avec les requêtes 2.0.0. Vous devrez ajouter un schéma à l'url: docs.python-requests.org/en/latest/user/advanced/#proxies Ce serait bien si vous pouviez ajouter ceci à votre réponse ici
Jay

28

J'ai trouvé qu'urllib a un très bon code pour récupérer les paramètres de proxy du système et qu'ils se trouvent dans la bonne forme à utiliser directement. Vous pouvez utiliser ceci comme:

import urllib

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

Cela fonctionne très bien et urllib sait également comment obtenir les paramètres Mac OS X et Windows.


Fonctionne-t-il sans proxy? Certains de nos utilisateurs n'ont pas de proxy et certains en ont.
jonasl

1
Inclut-il no_proxy et les demandes respectent-elles no_proxy? Peu
importe

4
se tromper:module 'urllib' has no attribute 'getproxies'
Zahra

4
Verdâtre: urllib.request.getproxies ()
oliche

1
@Zahra essayez urllib2.getproxies ()
rleelr

25

Vous pouvez consulter la documentation du proxy ici .

Si vous devez utiliser un proxy, vous pouvez configurer des requêtes individuelles avec l'argument proxies pour n'importe quelle méthode de requête:

import requests

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

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

Pour utiliser HTTP Basic Auth avec votre proxy, utilisez la syntaxe http: // user: password@host.com/ :

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

17

La réponse acceptée a été un bon début pour moi, mais j'ai continué à recevoir l'erreur suivante:

AssertionError: Not supported proxy scheme None

La solution à ce problème était de spécifier le http: // dans l'URL du proxy ainsi:

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
            }

Je serais intéressé de savoir pourquoi l'original fonctionne pour certaines personnes mais pas pour moi.

Edit: Je vois que la réponse principale est maintenant mise à jour pour refléter cela :)


4
modifié avec la version 2.0.0: les URL proxy doivent maintenant avoir un schéma explicite. Une exception MissingSchema sera déclenchée si ce n'est pas le cas.
Jay

4

Si vous souhaitez conserver les cookies et les données de session, vous feriez mieux de le faire comme suit:

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 ans de retard. Mais j'aime:

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

voici ma classe de base en python pour le module de requêtes avec quelques configs proxy et chronomètre!

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

Je viens de créer un graber de proxy et je peux également me connecter avec le même proxy noté sans aucune entrée, voici:

#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

Il est un peu tard mais voici une classe wrapper qui simplifie le scraping des proxies puis la création d'un http POST ou GET:

Demandes de proxy

https://github.com/rootVIII/proxy_requests

0

Je partage du code pour récupérer des proxies sur le site "https://free-proxy-list.net" et stocker des données dans un fichier compatible avec des outils comme "Elite Proxy Switcher" (format IP: PORT):

## PROXY_UPDATER - obtenez des proxys gratuits sur 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")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.