Python, проверяет, жив ли прокси? - PullRequest
0 голосов
/ 25 августа 2011

код:

 for item in pxfile.readlines():
     if is_OK(item):
         sys.stdout.write(item + "is not OK.")
         item = make(item)
         item = "#" + item
         resfile.write(item)
     else:
         sys.stdout.write(item)
         sys.stdout.write("is OK.")
         line = make(item)
         resfile.write(item)

Если is_OK имеет значение true, это означает, что прокси не существует, следует исправить это.

def is_OK(ip):
    try:
        proxy_handler = urllib2.ProxyHandler({'http': ip})
        opener = urllib2.build_opener(proxy_handler)
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        urllib2.install_opener(opener)
        req=urllib2.Request('http://www.icanhazip.com')
        sock=urllib2.urlopen(req)
    except urllib2.HTTPError, e:
        #print 'Error code: ', e.code
        return e.code
    except Exception, detail:

        #print "ERROR:", detail
        return 1
    return 0

Требуется 10 минут, чтобы получить такой список:

141.219.252.132:68664
is OK.118.174.0.155:8080
is OK.91.194.246.169:8080
is not OK.91.194.246.81:8080
is OK.201.245.110.138:8888
is OK.202.43.178.31:3128
is OK.202.109.80.106:8080
  1. Есть ли способ сделать это быстрее?
  2. Плохо отформатирован, я пытался удалить перевод строки с помощью strip () но не повезло.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Вы должны использовать потоки, чтобы ускорить выполнение кода:

import urllib2, threading

def is_OK(ip):
    print 'Trying %s ...' % ip
    try:
        proxy_handler = urllib2.ProxyHandler({'http': ip})
        opener = urllib2.build_opener(proxy_handler)
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        urllib2.install_opener(opener)
        req=urllib2.Request('http://www.icanhazip.com')
        urllib2.urlopen(req)
        print '%s is OK' % ip
    except urllib2.HTTPError:
        print '%s is not OK' % ip
    except Exception:
        print '%s is not OK' % ip

a = threading.Thread(None, is_OK, None, ("hostname1",), None)
a.start()
b = threading.Thread(None, is_OK, None, ("hostname2",), None)
b.start()
1 голос
/ 25 августа 2011

И для форматирования, используя strip (), все должно быть в порядке:

for line in pxfile:
    item = line.strip()
    if is_OK(item):
        sys.stdout.write(item + " is not OK.\n")
        resfile.write("# " + make(item) +"\n")
     else:
        sys.stdout.write(item + " is OK.\n")
        resfile.write(make(item) +"\n")
1 голос
/ 25 августа 2011

Первая идея, установить более короткий тайм-аут, чем по умолчанию

timeout = 10
sock=urllib2.urlopen(req, None, timeout)

Вы также можете использовать многопоточность, чтобы можно было одновременно протестировать несколько соединений.

...