【问题标题】:Scrapy crawl entire website before follow在关注之前抓取整个网站
【发布时间】:2016-06-25 10:59:49
【问题描述】:

我使用 Scrapy 爬虫无限期地爬网,我的脚本使用DEPTH_LIMIT = 0

我有两个主要问题:

  1. 我的爬虫在完全爬取start_urls 中的第一个网站之前跟踪网站。

  2. 爬虫停留在像tumblryoutube 这样的大网站上,他一直在上面爬取数十亿页。如何避免这种情况?我无法在 deny 变量上列出所有大型网站。

.

class MyItem(Item):
    url = Field()

class HttpbinSpider(CrawlSpider):

    name = "expired"
    start_urls = ['http://www.siteA.com']

    rules = (
        Rule(LinkExtractor(allow=('.com', '.fr', '.net', '.org', '.info', '.casino'),
                           deny=('facebook','amazon', 'wordpress', 'blogspot', 'free', 'reddit', 'videos', 'youtube', 'google', 'doubleclick', 'microsoft', 'yahoo', 'bing', 'znet', 'stackexchang', 'twitter', 'wikipedia', 'creativecommons', 'mediawiki', 'wikidata'),
                           ),
             process_request='add_errback', 
             follow=True),
    )

    custom_settings = {
        'RETRY_ENABLED': True,
        'DEPTH_LIMIT' : 0,
        'LOG_ENABLED' : True,
        'CONCURRENT_REQUESTS_PER_DOMAIN' : 32,
        'CONCURRENT_REQUESTS' : 64,
    }

    def add_errback(self, request):
        self.logger.debug("add_errback: patching %r" % request) 
        return request.replace(errback=self.errback_httpbin)

    def errback_httpbin(self, failure):
        self.logger.error(repr(failure))

        if failure.check(HttpError):
            response = failure.value.response
            self.logger.error('HttpError on %s', response.url)

        elif failure.check(DNSLookupError):
            request = failure.request
            self.logger.info('Domain expired : %s', request.url)

        elif failure.check(TimeoutError):
            request = failure.request
            self.logger.error('TimeoutError on %s', request.url)

【问题讨论】:

    标签: python web-scraping scrapy scrapy-spider


    【解决方案1】:

    来自精美手册:

    Scrapy 是按广度优先还是深度优先的顺序爬行?

    默认情况下,Scrapy 使用 LIFO 队列来存储挂起的请求, 这基本上意味着它按 DFO 顺序爬行。这个订单更多 在大多数情况下很方便。如果您确实想以真正的 BFO 顺序爬行, 您可以通过设置以下设置来做到这一点:

    DEPTH_PRIORITY = 1

    SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'

    SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多