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

我有两个主要问题:


我的抓取工具会先跟踪网站,然后再完全抓取start_urls中的第一个网站。
搜寻器停留在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)

最佳答案

从精美的手册中:


  Scrapy是否以广度优先或深度优先的顺序爬行?
  
  默认情况下,Scrapy使用LIFO队列存储未决请求,
  这基本上意味着它按DFO顺序进行抓取。这个命令更多
  在大多数情况下都很方便。如果您确实想按真实的BFO顺序进行抓取,
  您可以通过设置以下设置来做到这一点:
  
  DEPTH_PRIORITY = 1
  
  SCHEDULER_DISK_QUEUE ='scrapy.squeues.PickleFifoDiskQueue'
  
  SCHEDULER_MEMORY_QUEUE ='scrapy.squeues.FifoMemoryQueue'

关于python - 在遵循之前先抓取整个网站,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35919212/

10-16 12:03