2012-02-18 90 views
2

我是使用Beautiful Soup的數據挖掘網站。第一頁是Scoutmob's map,我抓住每個城市,打開頁面,並抓住該城市每筆交易的URL。Python創建工作隊列

目前我沒有使用線程,並且所有內容都正在被連續處理。對於所有500個交易(來自所有城市),我的計劃目前需要大約400秒。

實踐中,我想修改我的代碼以使用線程。我已經閱讀了關於如何在Python中創建隊列的tutorials and examples,但我不想創建500個線程來處理500個URL。

相反,我想創建約20(工人)線程來處理所有的網址。 有人能告訴我一個例子,20個線程如何處理隊列中的500個URL?

我希望每個工作人員從隊列中獲取未處理的URL,然後數據挖掘完成後再處理另一個未處理的URL。每個工作人員只有在隊列中沒有更多URL時纔會退出。

順便說一下,雖然每個工作人員都是數據挖掘,但它也會將內容寫入數據庫。因此,數據庫中可能存在線程問題,但這是另一個問題:-)。

在此先感謝!

+0

「我想每個工人搶從隊列中未處理的URL,以及數據挖掘,那麼一旦完成,」就是答案。你還想知道什麼?你問如何使用隊列的get方法? – 2012-02-19 00:12:11

+0

我想我不是線程將如何保持「打開」,直到隊列中沒有更多項目。我是否需要首先完全填充隊列,才能像隊列中的「實時」連接一樣創建隊列,並且線程一直工作,直到我告訴它停止? – hobbes3 2012-02-21 21:38:50

+0

我無法理解你的問題。你是否假設當隊列爲空時線程都會神奇地停止?他們爲什麼要那樣做? – 2012-02-21 22:03:04

回答

2

對於您的示例創建工作隊列可能矯枉過正。如果您抓取爲每個頁面發佈的rss提要,而不是嘗試解析速度較慢的HTML,那麼您可能會有更好的運氣。我把下面這個快速的小腳本放在一起,總共解析它〜13秒...〜8秒鐘抓住城市,5秒鐘解析全部 rss饋送。

在今天的運行中,它從13個城市(總共有20個城市上市,但其中7個被列爲「即將推出」)獲得310個總交易。

#!/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 
+0

感謝您的回覆,但有些事情是不正確的......迄今爲止,所有城市共有556筆交易。只閱讀RSS提要對我來說是不夠的,因爲RSS提要沒有告訴我每筆交易的足夠信息(如商家地址和電話號碼)。另外它似乎RSS飼料也有新聞文章,我不在乎。所以我仍然需要打開每個單獨的交易頁面。你的代碼是非常多的RSS提要和使用Xpath獲取所有信息? – hobbes3 2012-02-21 06:54:06

0

只要執行它。你幾乎已經通過那裏的答案通過自己的答案

我希望每個工人從隊列中抓取一個未處理的URL,然後數據挖掘完成後再處理另一個未處理的URL。每個工作人員只有在隊列中沒有更多URL時纔會退出。