gpt4 book ai didi

python - Python创建 worker 队列

转载 作者:行者123 更新时间:2023-12-03 13:00:48 25 4
gpt4 key购买 nike

我正在使用Beautiful Soup数据挖掘网站。第一页是Scoutmob's map,我在其中抓取每个城市,打开页面,然后抓取该城市中每笔交易的URL。

目前,我不使用线程,并且所有内容都正在按顺序处理。对于大约500笔交易(来自所有城市),我的程序目前大约需要400秒。

为了练习,我想修改我的代码以使用线程。我已经阅读了有关如何在Python中创建队列的tutorials and examples,但是我不想创建500个线程来处理500个URL。

相反,我想创建大约20个(工作人员)线程来处理所有URL。 有人可以向我展示一个示例,其中20个线程如何处理队列中的500个URL?

我希望每个工作人员从队列中获取一个未处理的URL,然后数据挖掘,然后一旦完成,就使用另一个未处理的URL。每个工作线程仅在队列中没有URL时退出。

顺便说一句,当每个工作人员都在进行数据挖掘时,它还将内容写入数据库。因此,数据库中的线程可能存在问题,但这是另一天的问题:-)。

提前致谢!

最佳答案

对于您的示例,创建工作人员队列可能是过大的。如果您抓取为每个页面发布的rss feed,而不是尝试解析速度较慢的HTML,则可能会比较幸运。我把下面的快速小脚本拍了下来,总共花了大约13秒……大约8秒来抓取城市,大约5秒来解析所有rss提要。

在今天的运行中,它从13个城市中获取了310笔交易(总共列出了20个城市,但其中7个被列为“即将推出”)。

#!/usr/bin/env python

from lxml import etree, html
from urlparse import urljoin
import time

t = time.time()
base = 'http://scoutmob.com/'
main = html.parse(base)
cities = [x.split('?')[0] for x in main.xpath("//a[starts-with(@class, 'cities-')]/@href")]
urls = [urljoin(base, x + '/today') for x in cities]
docs = [html.parse(url) for url in urls]
feeds = [doc.xpath("//link[@rel='alternate']/@href")[0] for doc in docs]
# filter out the "coming soon" feeds
feeds = [x for x in feeds if x != 'http://feeds.feedburner.com/scoutmob']
print time.time() - t
print len(cities), cities
print len(feeds), feeds

t = time.time()
items = [etree.parse(x).xpath("//item") for x in feeds]
print time.time() - t
count = sum(map(len, items))
print count

产生以下输出:
7.79690480232
20 ['/atlanta', '/new-york', '/san-francisco', '/washington-dc', '/charlotte', '/miami', '/philadelphia', '/houston', '/minneapolis', '/phoenix', '/san-diego', '/nashville', '/austin', '/boston', '/chicago', '/dallas', '/denver', '/los-angeles', '/seattle', '/portland']
13 ['http://feeds.feedburner.com/scoutmob/atl', 'http://feeds.feedburner.com/scoutmob/nyc', 'http://feeds.feedburner.com/scoutmob/sf', 'http://scoutmob.com/washington-dc.rss', 'http://scoutmob.com/nashville.rss', 'http://scoutmob.com/austin.rss', 'http://scoutmob.com/boston.rss', 'http://scoutmob.com/chicago.rss', 'http://scoutmob.com/dallas.rss', 'http://scoutmob.com/denver.rss', 'http://scoutmob.com/los-angeles.rss', 'http://scoutmob.com/seattle.rss', 'http://scoutmob.com/portland.rss']
4.76977992058
310

关于python - Python创建 worker 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com