我正在研究大数据的网页抓取,所以我编写了以下代码,从我们校园的本地服务器获取一些信息。它工作正常,但我认为性能很慢;每条记录需要0.91秒才能存储在数据库中。代码的作用是打开一个网页,获取一些内容并将其存储在磁盘上。
我的目标是将录制内容的时间减少到接近0.4秒(或更低,如果可能的话)。
#!/usr/bin/env python
import scraperwiki
import requests
import lxml.html
for i in range(1, 150):
try:
html = requests.get("http://testserver.dc/"+str(i)"/").content
dom = lxml.html.fromstring(html)
for entry in dom.cssselect('.rTopHeader'):
name = entry.cssselect('.bold')[0].text_content()
for entry in dom.cssselect('div#rProfile'):
city = entry.cssselect('li:nth-child(2) span')[0].text_content()
for entry in dom.cssselect('div#rProfile'):
profile_id = entry.cssselect('li:nth-child(3) strong a')[0].get('href')
profile = {
'name':name,
'city':city,
'profile_id':profile_id
}
unique_keys = [ 'profile_id' ]
scraperwiki.sql.save(unique_keys, profile)
print jeeran_id
except:
print 'Error: ' + str(i)
答案 0 :(得分:2)
这是非常好的,你有明确的目标,你想要优化多远。
很可能,限制因素是抓住网址。
简化您的代码和测量,刮取多长时间。如果这不符合您的时间标准(如一个请求需要0.5秒),您必须同时进行刮擦。搜索StackOverflow,有很多这样的问题和答案,使用线程,绿线等。
您的DOM创建可以转换为迭代解析。它需要更少的内存,而且通常要快得多。 lxml
允许使用iterparse
等方法。另请参阅related SO answer
逐个编写许多记录可以变成一堆写下来。