加快网络抓取速度

2024-05-18

我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy。我对 scrapy 甚至 python 都很陌生,但设法编写了一个可以完成这项工作的蜘蛛。然而,它确实很慢(爬行 23770 个页面大约需要 28 小时)。

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

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

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

Thanks!


以下是一些值得尝试的事情:

  • 使用最新的 scrapy 版本(如果尚未使用)
  • 检查是否使用了非标准中间件
  • 尝试增加CONCURRENT_REQUESTS_PER_DOMAIN, CONCURRENT_REQUESTS设置 (docs http://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests)
  • 关闭日志记录LOG_ENABLED = False (docs http://doc.scrapy.org/en/latest/topics/settings.html#log-enabled)
  • try yield循环中的项目而不是将项目收集到items列出并返回它们
  • 使用本地缓存 DNS(请参阅这个线程 https://stackoverflow.com/questions/12427451/how-do-i-improve-scrapys-download-speed)
  • 检查此网站是否使用下载阈值并限制您的下载速度(请参阅这个线程 https://stackoverflow.com/questions/13505194/scrapy-crawling-speed-is-slow-60-pages-min#comment18491083_13505194)
  • 记录蜘蛛运行期间的 cpu 和内存使用情况 - 查看是否存在任何问题
  • 尝试在下面运行同一个蜘蛛scrapyd http://scrapyd.readthedocs.org/en/latest/ service
  • see if 请求 https://github.com/kennethreitz/grequests + lxml http://lxml.de/会表现更好(询问您是否需要任何帮助来实施此解决方案)
  • 尝试跑步Scrapy on pypy, see 在 PyPy 上运行 Scrapy https://stackoverflow.com/questions/31029362/running-scrapy-on-pypy

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加快网络抓取速度 的相关文章