>>> from grab import Grab, GrabError
from urllib import quote
import re
g = Grab()
g.go('www.google.ru/search?num=100&q=' + quote('free proxy +":8080"'))
rex = re.compile(r'(?:(?:[-a-z0-9]+\.)+)[a-z0-9]+:\d{2,4}')
for proxy in rex.findall(g.drop_space(g.css_text('body'))):
g.setup(proxy=proxy, proxy_type='http', connect_timeout=5, timeout=5)
try:
g.go('google.com')
except GrabError:
print proxy, 'FAIL'
else:
print proxy, 'OK'
В таком варианте все прокси пишут ‘FAIL’ практически независимо от работоспособности. Может выдать ‘OK’ на нерабочий, но редко. Прям мистика.
Если сделать g.setup(proxy=рабочий_прокси, proxy_type='http', connect_timeout=5, timeout=5), этот прокси нормально чекнется и напишет ‘OK’.
И того по отдельности работает:
g = Grab()
g.go('http://www.domain.com/proxy.txt')
rex = re.compile(r'(?:(?:[-a-z0-9]+\.)+)[a-z0-9]+:\d{2,4}')
proxy = rex.findall(g.response.body)
print proxy
['164.151.129.37:3128', '122.226.113.54:808', '60.216.101.232:808']
g.setup(proxy='nn.nn.nn.nn:8080', proxy_type='http', connect_timeout=5, timeout=5)
try:
g.go('http://domain.com/')
except GrabError:
print 'FAIL'
else:
print 'ok'
Нужно совместить, чтобы проверялись прокси из списка. Желателно в несколько потоков.