这里是新手。我用urllib2编写了一个简单的脚本Billboard.com网站从1958年到2013年,每周评选出最受欢迎的歌曲和艺术家。问题是它太慢了--需要几个小时才能完成。在
我想知道瓶颈在哪里,是否有一种方法可以更有效地使用Urllib2进行清理,或者是否需要使用更复杂的工具?在
import re
import urllib2
array = []
url = 'http://www.billboard.com/charts/1958-08-09/hot-100'
date = ""
while date != '2013-07-13':
response = urllib2.urlopen(url)
htmlText = response.read()
date = re.findall('\d\d\d\d-\d\d-\d\d',url)[0]
song = re.findall('<h1>.*</h1>', htmlText)[0]
song = song[4:-5]
artist = re.findall('/artist.*</a>', htmlText)[1]
artist = re.findall('>.*<', artist)[0]
artist = artist[1:-1]
nextWeek = re.findall('href.*>Next', htmlText)[0]
nextWeek = nextWeek[5:-5]
array.append([date, song, artist])
url = 'http://www.billboard.com' + nextWeek
print array
下面是一个使用Scrapy的解决方案。看看overview,你就会明白,它是为这类任务设计的工具:
bs
或{这是一个工作蜘蛛,它可以提取你所要求的一切(在我那台相当旧的笔记本电脑上工作了15分钟):
将其保存到
^{pr2}$billboard.py
并通过scrapy runspider billboard.py -o output.json
运行。然后,在output.json
中,您将看到:另外,请看一下grequests作为一个替代工具。在
希望有帮助。在
你的瓶颈几乎肯定是从网站获取数据。每个网络请求都有延迟,这会阻止同时发生其他任何事情。您应该考虑跨多个线程拆分请求,以便一次可以发送多个请求。基本上,这里的性能受I/O限制,而不是CPU限制。在
这里有一个简单的解决方案,你可以看到爬虫一般是如何工作的。从长远来看,使用Scrapy之类的东西可能是最好的,但我发现从简单明了的东西开始总是有帮助的。在
相关问题 更多 >
编程相关推荐