2009-04-19 3 views
10

Я написал скрипт на питоне, который использует файлы cookie и POST/GET. Я также включил поддержку прокси в моем скрипте. Однако, когда вы вводите прокси-сервер с прокси-сервером, сценарий падает. Есть ли способ проверить, мертв/жив прокси, прежде чем запускать остальную часть моего скрипта?Proxy Check in python

Кроме того, я заметил, что некоторые прокси не обрабатывают файлы cookie/POST-заголовки должным образом. Есть ли способ исправить это?

+0

Разве вы не можете просто поймать исключение? – marcog

+0

Я думаю, что поймать исключение - это не лучший способ сделать это, проверьте комментарий, который я оставил в ответе dbr. Не могли бы вы дать мне свое мнение? потому что я планирую написать прокси-проверку самостоятельно (я только начинаю с python, и это будет мой второй скрипт python). – jahmax

ответ

13

Самым простым было это просто поймать исключение IOError из 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" 

Кроме того, из this blog post - "check status proxy address" (с некоторыми незначительными улучшениями):

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

Помните, что это может удвоить время сценарий если прокси-сервер отключен (так как вам придется ждать два таймаута подключения). Если вам не нужно знать, что прокси-сервер виноват, обработка IOError намного чище, проще и быстрее.

+1

Но некоторые прокси могут подключаться к URL-адресу, но они не открывают фактический html из этого URL-адреса, они показывают настраиваемую ошибку, поэтому вы не можете поймать исключение там, не было бы лучше проверить строку в req. читать()? – jahmax

+0

В чем разница между 'socket.setdefaulttimeout()' и параметром 'urllib'' timeout'? – User

+0

@macdonjo довольно уверен, что параметр тайм-аута urllib является новым в Python 3. Вероятно, это намного лучше, чем 'socket.setdefaulttimeout', который применяется глобально – dbr

1

Я думаю, что лучший подход подобен dbr, сказал, обрабатывая исключение.

Другого решения, которое может быть лучше в некоторых случаях, чтобы использовать внешний online proxy checker инструмент для проверки, если прокси-сервер жив, а затем продолжать использовать скрипт без каких-либо изменений.

0

Существует один хороший пакет Grab Так что, если это хорошо для вас, вы можете написать что-то вроде этого (простой действительный проверки прокси-генератора):

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

Документация вряд ли будет английской – User