【问题标题】:Performance Optimization of scraping code抓取代码的性能优化
【发布时间】:2014-05-11 09:28:10
【问题描述】:

我正在研究大数据的网络抓取,因此我编写了以下代码以从我们校园的本地服务器获取一些信息。它工作正常,但我认为性能很慢;每条记录需要 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)

【问题讨论】:

  • 您有 3 个地方消耗时间:http 获取、dom 操作和数据库保存。你应该做的是首先只使用 get 进行循环,然后使用 get 和 dom 操作但不保存数据库,最后进行完全处理。这将为您提供可以赢得时间的地方。
  • 在某些时候,对于每条记录的抓取速度,您可能无能为力,因为这取决于您的网络延迟。您可以考虑通过多线程并行进行抓取。

标签: python web-scraping scraperwiki


【解决方案1】:

很好,你有明确的目标,你想优化多远。

先测量抓取所需的时间

很可能,限制因素是抓取网址。

简化您的代码并衡量抓取所需的时间。如果这不符合您的时间标准(例如一个请求需要 0.5 秒),您必须并行进行抓取。搜索StackOverflow,有很多这样的问题和答案,使用线程,绿色线程等。

进一步的优化提示

解析 XML - 使用迭代/SAX 方法

您的 DOM 创建可以变成迭代解析。它需要更少的内存,而且通常更快。 lxml 允许像 iterparse 这样的方法。另见related SO answer

优化写入数据库

多条记录一条一条写,可以变成一串写。

【讨论】:

  • 在数据库优化上,scraperwiki.sql.save单独保存记录比较慢。你可以pass it a list of dicts instead。正如 Jan 所说,抓取时间可能是决定速率的步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多