2009-04-19 13 views
10

Napisałem skrypt w Pythonie, który używa plików cookie i POST/GET. W moim skrypcie uwzględniłem także obsługę proxy. Jednak po wpisaniu nieczynnego proxy proxy skrypt ulega awarii. Czy istnieje sposób sprawdzenia, czy serwer proxy jest martwy/żywy przed uruchomieniem reszty mojego skryptu?Proxy Check in python

Ponadto zauważyłem, że niektóre serwery proxy prawidłowo nie obsługują plików cookie/nagłówków POST. Czy istnieje sposób, aby to naprawić?

+0

nie można po prostu złapać wyjątek? – marcog

+0

Myślę, że złapanie wyjątku nie jest najlepszym sposobem, aby to zrobić, sprawdź komentarz pozostawiony w odpowiedzi dbr. Czy możesz podać mi swoją opinię? ponieważ planuję napisać samemu kontroler proxy (im właśnie zaczynam od pythona i to będzie mój drugi skrypt python). – jahmax

Odpowiedz

13

Najprostszy był to po prostu złapać wyjątek IOError z 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" 

Również od this blog post - "check status proxy address" (z niewielkimi ulepszenia):

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

Pamiętaj, to może się podwoić czas skrypt trwa, jeśli serwer proxy jest wyłączony (ponieważ będziesz musiał czekać na dwa limity czasu połączenia). O ile nie musisz wiedzieć, że serwer proxy jest uszkodzony, obsługa IOError jest znacznie czystsza, prostsza i szybsza ..

+1

Jednak niektóre proxy mogą łączyć się z adresem URL, ale nie otwierają rzeczywistego html z tego adresu URL, pokazują niestandardowy błąd, więc nie można złapać tam wyjątku, nie byłoby lepiej sprawdzić ciąg w żądaniu. czytać()? – jahmax

+0

Jaka jest różnica między 'socket.setdefaulttimeout()' a parametrem 'urllib'' timeout'? – User

+0

@macdonjo całkiem pewien, że parametr timeout urllib jest nowy w Pythonie 3. Jest prawdopodobnie znacznie lepszy niż "socket.setdefaulttimeout", który stosuje się globalnie. – dbr

1

Myślę, że lepsze podejście jest takie, jak powiedział Dbr, obsługując wyjątek.

Innym rozwiązaniem, które może być lepsze w niektórych przypadkach, jest użycie zewnętrznego narzędzia o nazwie online proxy checker w celu sprawdzenia, czy serwer proxy działa, a następnie kontynuowania używania skryptu bez żadnych modyfikacji.

0

Jest jeden ładny pakiet Grab Tak więc, jeśli jest ok dla ciebie, możesz napisać coś takiego (proste ważny proxy Checker-generator):

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

Dokumentacja prawie nie jest angielska – User