首页 / 爬虫 / Python多线程爬虫
Python多线程爬虫
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python多线程爬虫,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3563字,纯文字阅读大概需要6分钟。
内容图文
![Python多线程爬虫](/upload/InfoBanner/zyjiaocheng/784/038e332325984552837b1514792803db.jpg)
你好!我正在尝试使用python编写Web爬虫.我想使用python多线程.即使在阅读了之前的建议论文和教程之后,我仍然有问题.我的代码在这里(整个源代码是here):
class Crawler(threading.Thread):
global g_URLsDict
varLock = threading.Lock()
count = 0
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self.url = self.queue.get()
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
Crawler.count +=1
print "total links: %d"%len(g_URLsDict)
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
self.queue.task_done()
#self.queue.task_done()
#self.queue.task_done()
print g_URLsDict
queue = Queue.Queue()
queue.put("http://www.ertir.com")
for i in range(5):
t = Crawler(queue)
t.setDaemon(True)
t.start()
queue.join()
它不能按需要工作,它不会在线程1之后给出任何结果,并且它会以不同的方式执行某些时间会产生此错误:
Exception in thread Thread-2 (most likely raised during interpreter shutdown):
我该如何解决?而且我认为这不仅仅比循环更有效.
我试图修复run():
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
#self.queue.task_done()
#self.queue.task_done()
self.queue.task_done()
我尝试使用task_done()命令,在不同的地方,任何人都可以解释差异吗?
解决方法:
您只在线程初始化时调用self.url = self.queue.get().如果您想要获取新的URL以便进一步处理,您需要尝试从while循环中的队列中重新获取URL.
尝试使用self.page = getPage(self.queue.get())替换self.page = getPage(self.url).请注意get函数将无限期地阻塞.您可能希望在一段时间后超时并为您的后台线程添加一些方法以通过请求正常退出(这将消除您看到的异常).
有some good examples on effbot.org以我上面描述的方式使用get().
编辑 – 您的初始评论的答案:
看看the docs for task_done();对于每次调用get()(不超时),你应该调用task_done()来告诉任何对join()的阻塞调用,现在处理该队列上的所有内容.每次调用get()都会阻塞(休眠),同时等待在队列中发布新的url.
编辑2 – 尝试此替代运行功能:
def run(self):
while 1:
print self.getName()+" started"
url = self.queue.get() # <-- note that we're blocking here to wait for a url from the queue
self.page = getPage(url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
Crawler.count +=1
print "total links: %d"%len(g_URLsDict)
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
self.queue.task_done() # <-- We've processed the url this thread pulled off the queue so indicate we're done with it.
内容总结
以上是互联网集市为您收集整理的Python多线程爬虫全部内容,希望文章能够帮你解决Python多线程爬虫所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。