这是一个创建于 3457 天前的主题,其中的信息可能已经有所发展或是发生改变。
正在做一套爬虫,需要有效代理防止被封。
方法是同时运行两个程序,一个爬虫程序、一个代理验证。代理验证是每隔2分钟就获取最新的代理列表依次验证ip有效性,有效的ip存入指定文件中,爬虫在读取这个文件的ip去抓数据。
目前问题是代理验证也就运行3、4轮就没了反应,也不提示报错什么的,google下貌似是什么多线程队列还是IO阻塞啥的,没看明白。。
第 1 条附言 · 2015-06-04 19:46:02 +08:00
class ProxyCheck(threading.Thread):
def __init__(self,proxyList):
threading.Thread.__init__(self)
self.proxyList = proxyList
self.timeout = 10
self.testUrl = "http://www.baidu.com/"
self.testStr = "030173"
def checkProxy(self):
cookies = urllib2.HTTPCookieProcessor()
for proxy in self.proxyList:
proxyHandler = urllib2.ProxyHandler({"http" : r'http://%s' % proxy})
opener = urllib2.build_opener(cookies,proxyHandler)
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1')]
t1 = time.time()
try:
req = opener.open(self.testUrl, timeout=self.timeout)
result = req.read()
timeused = time.time() - t1
pos = result.find(self.testStr)
title = re.search(r'<title>(.*?)</title>',urllib2.urlopen('http://www.baidu.com').read())
if title:baidu_title = title.group(1)
else:baidu_title = '无法打开网页'
if (pos > -1) and (timeused < 5) and baidu_title == '百度一下,你就知道':checkedProxyList.append((proxy,timeused))
else: continue
except Exception,e:
print e.message
continue
def sort(self):
sorted(checkedProxyList,cmp=lambda x,y:cmp(x[1],y[1]))
def run(self):
self.checkProxy()
self.sort()
if __name__ == "__main__":
getThreads = []
checkThreads = []
for i in range(35):
t = ProxyCheck(rawProxyList[((len(rawProxyList)+34)/35) * i:((len(rawProxyList)+34)/35) * (i+1)])
checkThreads.append(t)
for i in range(len(checkThreads)):
checkThreads[i].start()
for i in range(len(checkThreads)):
checkThreads[i].join()
第 2 条附言 · 2015-06-04 19:51:47 +08:00
定时循环是通过while弄得
while 1:
os.system("python 代理验证.py")
time.sleep(120)
2 条回复 • 2015-06-04 14:35:05 +08:00
|
|
1
aisk 2015-06-04 12:52:53 +08:00
记得设置超时。
|
|
|
2
est 2015-06-04 14:35:05 +08:00 1
提出这样的问题,期待的答案是基本靠猜么。。。
|