2009-04-19 22 views
10

He escrito un script en python que usa cookies y POST/GET. También incluí el soporte de proxy en mi script. Sin embargo, cuando uno ingresa un proxy proxy muerto, el script se bloquea. ¿Hay alguna manera de verificar si un proxy está muerto/vivo antes de ejecutar el resto de mi script?Proxy Check en python

Además, he notado que algunos proxies no manejan las cookies/POST correctamente. ¿Hay alguna forma de arreglar esto?

+0

¿No puedes detectar la excepción? – marcog

+0

Creo que atrapar la excepción no es la mejor manera de hacerlo, verifique el comentario que dejé en la respuesta dbr. ¿Podrías darme tu opinión? porque estoy planeando escribir un comprobador de proxy yo mismo (estoy empezando con Python y este será mi segundo script de python). – jahmax

Respuesta

13

El más simple era es simplemente detectar la excepción IOError de urllib:

try: 
    urllib.urlopen(
     "http://example.com", 
     proxies={'http':'http://example.com:8080'} 
    ) 
except IOError: 
    print "Connection error! (Check proxy)" 
else: 
    print "All was fine" 

Asimismo, desde this blog post - "check status proxy address" (con algunas mejoras leves):

import urllib2 
import socket 

def is_bad_proxy(pip):  
    try: 
     proxy_handler = urllib2.ProxyHandler({'http': pip}) 
     opener = urllib2.build_opener(proxy_handler) 
     opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
     urllib2.install_opener(opener) 
     req=urllib2.Request('http://www.example.com') # change the URL to test here 
     sock=urllib2.urlopen(req) 
    except urllib2.HTTPError, e: 
     print 'Error code: ', e.code 
     return e.code 
    except Exception, detail: 
     print "ERROR:", detail 
     return True 
    return False 

def main(): 
    socket.setdefaulttimeout(120) 

    # two sample proxy IPs 
    proxyList = ['125.76.226.9:80', '213.55.87.162:6588'] 

    for currentProxy in proxyList: 
     if is_bad_proxy(currentProxy): 
      print "Bad Proxy %s" % (currentProxy) 
     else: 
      print "%s is working" % (currentProxy) 

if __name__ == '__main__': 
    main() 

Recuerde que esto podría duplicar el tiempo de la secuencia de comandos toma, si el proxy está inactivo (ya que tendrá que esperar dos tiempos de espera de conexión). A menos que tenga que saber específicamente que el proxy tiene la culpa, manejar el IOError es mucho más limpio, simple y rápido.

+1

Pero algunos proxies pueden conectarse a la url pero no abren el html real de esa url, muestran un error personalizado por lo que no se puede capturar una excepción allí, no sería mejor buscar una cadena en la req. leer()? – jahmax

+0

¿Cuál es la diferencia entre 'socket.setdefaulttime()' y el parámetro 'urllib'' timeout'? – User

+0

@macdonjo bastante seguro de que el parámetro de tiempo de espera de urllib es nuevo en Python 3. Es probable que sea mucho mejor que el 'socket.setdefaulttime' que se aplica globalmente – dbr

1

Creo que el mejor enfoque es como dijo dbr, manejando la excepción.

Otra solución que podría ser mejor en algunos casos, es utilizar una herramienta externa online proxy checker para comprobar si un servidor proxy está vivo y luego seguir utilizando la secuencia de comandos sin ninguna modificación.

0

Hay un buen paquete Grab Por lo tanto, si bien para usted, usted puede escribir algo como esto (sencilla de poder válido corrector-generador):

from grab import Grab, GrabError 

def get_valid_proxy(proxy_list): #format of items e.g. '128.2.198.188:3124' 
    g = Grab() 
    for proxy in proxy_list: 
     g.setup(proxy=proxy, proxy_type='http', connect_timeout=5, timeout=5) 
     try: 
      g.go('google.com') 
     except GrabError: 
      #logging.info("Test error") 
      pass 
     else: 
      yield proxy 
+0

La documentación es apenas Inglés – User