Proxies com o módulo 'Solicitações' do Python

159

Apenas uma breve e simples sobre o excelente módulo de solicitações para Python.

Não consigo encontrar na documentação o que a variável 'proxies' deve conter. Quando eu envio um ditado com um valor padrão "IP: PORT", ele o rejeita pedindo 2 valores. Então, eu acho (porque isso não parece ser coberto nos documentos) que o primeiro valor é o ip e o segundo a porta?

Os documentos mencionam apenas isso:

proxies - (opcional) Protocolo de mapeamento de dicionário para a URL do proxy.

Então eu tentei isso ... o que devo fazer?

proxy = { ip: port}

e devo convertê-los para algum tipo antes de colocá-los no dict?

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

Respostas:

281

A proxiessintaxe 'dict é {"protocol":"ip:port", ...}. Com ele, você pode especificar proxies diferentes (ou iguais) para solicitações usando os protocolos http , https e 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)

Deduzido da requestsdocumentação :

Parâmetros:
method - método para o novo objeto Request.
url- URL para o novo objeto de solicitação.
...
proxies- (opcional) Protocolo de mapeamento de dicionário para o URL do proxy . ...


No Linux, você também pode fazer isso através dos HTTP_PROXY, HTTPS_PROXYe FTP_PROXYvariáveis de ambiente:

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

No 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

Obrigado, Jay, por apontar isso:
A sintaxe foi alterada com as solicitações 2.0.0 .
Você precisará adicionar um esquema ao URL: https://2.python-requests.org/en/latest/user/advanced/#proxies

chown
fonte
@cigar eu sabia porque o urllib2 usa exatamente o mesmo formato para o ditado de seus proxies e quando vi docs.python-requests.org/en/latest/api/#module-requests dizer "proxies - (opcional) protocolo de mapeamento de dicionário para o URL do proxy. ", Eu sabia imediatamente.
chown
1
ahhh entendi, nunca usei proxies com urllib2 por causa dos conselhos para se livrar dele obtido daqui, substitui 2 páginas de código por 8 linhas: / re: shoulder :))) ótima estadia aqui, você já me salvou horas em total! se você precisar de ajuda com a música, dê um grito, que eu possa dar conselhos, caso contrário, não consigo pensar em outra maneira de retribuir do que agradecimentos ou xícaras de chá!
Parece pedidos e, além disso, urllib3 não pode fazer um CONNECT ao usar um proxy :(
dzen
@ Dzen ainda não usei, urllib3então vou ter que olhar para isso. Obrigado pela atenção.
chown
3
@chown a sintaxe foi alterada com as solicitações 2.0.0. Você precisará adicionar um esquema ao URL: docs.python-requests.org/en/latest/user/advanced/#proxies Seria bom se você pudesse adicionar isso à sua resposta aqui
Jay Jay
28

Eu descobri que o urllib tem um código muito bom para selecionar as configurações de proxy do sistema e elas estão na forma correta para serem usadas diretamente. Você pode usar isso como:

import urllib

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

Funciona muito bem e o urllib também sabe como obter as configurações do Mac OS X e Windows.

Ben Golding
fonte
Funciona sem um proxy? Alguns de nossos usuários não têm proxy e outros possuem.
jonasl
1
Inclui no_proxy e as solicitações respeitam no_proxy? Não importa, parece que há soluções: github.com/kennethreitz/requests/issues/879
jrwren
4
ficando errado:module 'urllib' has no attribute 'getproxies'
Zahra 2/17
4
Esverdeado: urllib.request.getproxies ()
oliche 3/17/17
1
@Zahra try urllib2.getproxies ()
rleelr
25

Você pode consultar a documentação do proxy aqui .

Se você precisar usar um proxy, poderá configurar solicitações individuais com o argumento proxies para qualquer método de solicitação:

import requests

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

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

Para usar a autenticação básica HTTP com seu proxy, use a sintaxe http: // user: [email protected]/ :

proxies = {
    "http": "http://user:[email protected]:3128/"
}
Zhifeng Hu
fonte
17

A resposta aceita foi um bom começo para mim, mas continuei recebendo o seguinte erro:

AssertionError: Not supported proxy scheme None

A correção para isso foi especificar o http: // no URL do proxy, assim:

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
            }

Eu estaria interessado em saber por que o original funciona para algumas pessoas, mas não para mim.

Editar: vejo que a resposta principal agora está atualizada para refletir isso :)

Owen B
fonte
4
alterado com 2.0.0: os URLs de proxy agora devem ter um esquema explícito. Uma exceção MissingSchema será gerada se não o fizer.
Jay
4

Se você quiser persistir os cookies e os dados da sessão, faça o seguinte:

import requests

proxies = {
    'http': 'http://user:[email protected]:3128',
    'https': 'https://user:[email protected]: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/')
Do utilizador
fonte
2

8 anos atrasado. Mas eu gosto:

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
qräbnö
fonte
1

aqui está minha classe básica em python para o módulo de pedidos com algumas configurações de proxy e cronômetro!

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()
mtt2p
fonte
1

Acabei de fazer um proxy graber e também pode se conectar com o mesmo proxy agarrado sem nenhuma entrada aqui é:

#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
Rae mh
fonte
0

É um pouco tarde, mas aqui está uma classe de wrapper que simplifica a raspagem de proxies e a criação de um http POST ou GET:

ProxyRequests

https://github.com/rootVIII/proxy_requests

fonte
0

Compartilho alguns códigos de como buscar proxies no site "https://free-proxy-list.net" e armazenar dados em um arquivo compatível com ferramentas como "Elite Proxy Switcher" (formato IP: PORT):

## PROXY_UPDATER - obtenha proxies gratuitos em 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")
Lambov
fonte