首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加快web抓取器速度

加快web抓取器速度
EN

Stack Overflow用户
提问于 2013-06-11 01:42:33
回答 4查看 14.5K关注 0票数 18

我用一个相当简单的网络刮刀用scrapy抓取了23770个网页。我对scrapy甚至python都是新手,但还是设法写了一个爬虫来完成这项工作。然而,它真的很慢(它需要大约。28小时爬行23770页)。

我已经查看了scrapy网页、邮件列表和stackoverflow,但我似乎找不到初学者可以理解的编写快速爬虫的通用建议。也许我的问题不是爬虫本身,而是我运行它的方式。欢迎所有建议!

如果需要的话,我在下面列出了我的代码。

代码语言:javascript
复制
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field
import re

class Sale(Item):
    Adresse = Field()
    Pris = Field()
    Salgsdato = Field()
    SalgsType = Field()
    KvmPris = Field()
    Rum = Field()
    Postnummer = Field()
    Boligtype = Field()
    Kvm = Field()
    Bygget = Field()

class HouseSpider(BaseSpider):
    name = 'House'
    allowed_domains = ["http://boliga.dk/"]
    start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select("id('searchresult')/tr")
        items = []      
        for site in sites:
            item = Sale()
            item['Adresse'] = site.select("td[1]/a[1]/text()").extract()
            item['Pris'] = site.select("td[2]/text()").extract()
            item['Salgsdato'] = site.select("td[3]/text()").extract()
            Temp = site.select("td[4]/text()").extract()
            Temp = Temp[0]
            m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp)
            if m:
                found = m.group(1)
                item['SalgsType'] = found
            else:
                item['SalgsType'] = Temp
            item['KvmPris'] = site.select("td[5]/text()").extract()
            item['Rum'] = site.select("td[6]/text()").extract()
            item['Postnummer'] = site.select("td[7]/text()").extract()
            item['Boligtype'] = site.select("td[8]/text()").extract()
            item['Kvm'] = site.select("td[9]/text()").extract()
            item['Bygget'] = site.select("td[10]/text()").extract()
            items.append(item)
        return items

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-11 02:46:56

下面是一组可以尝试的东西:

  • 使用最新的scrapy版本(如果尚未使用)
  • 检查是否使用了非标准中间件
  • 尝试增加CONCURRENT_REQUESTS_PER_DOMAIN,如果此站点使用下载阈值并限制您的下载速度,请参阅(docs)
  • turn (docs)
  • try this thread)
  • check this thread)
  • log CONCURRENT_REQUESTS LOG_ENABLED = False yield items -查看是否存在任何问题,并尝试在scrapyd serviceH228<下运行相同的爬虫程序/code>
  • 看看grequests + lxml的性能是否会更好(询问您在pypy上运行Scrapy时是否需要任何帮助来实现此solution)
  • try,请参阅Running Scrapy on PyPy

希望这能有所帮助。

票数 37
EN

Stack Overflow用户

发布于 2013-06-11 07:21:26

查看您的代码,我会说大部分时间都花在网络请求上,而不是处理响应上。@alecxe在他的回答中提供的所有提示都适用,但我建议使用HTTPCACHE_ENABLED设置,因为它会缓存请求并避免再次执行。这将有助于后续的爬行,甚至离线开发。在文档中查看更多信息:http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.contrib.downloadermiddleware.httpcache

票数 5
EN

Stack Overflow用户

发布于 2015-10-18 10:19:54

我也在做网络抓取,使用优化的C#,它最终占用了CPU,所以我换成了C。

解析HTML会耗尽CPU数据缓存,并且非常确定您的CPU根本没有使用SSE 4.2,因为您只能使用C/C++访问此功能。

如果你做了计算,你很快就会受到计算的限制,但不会受到内存的限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17029752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档