首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在跟随之前抓取整个网站

在跟随之前抓取整个网站
EN

Stack Overflow用户
提问于 2016-03-10 14:27:28
回答 1查看 522关注 0票数 1

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

我有两个主要问题:

  1. 我的爬虫跟踪网站之前,爬行完全在start_urls的第一个网站。
  2. 爬虫停留在像tumblryoutube这样的大型网站上,而他则在上面爬行数十亿页。如何避免这种情况?我不能列出deny变量上的每个大站点。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 16:39:32

从精美的手册上看:

刮痕爬行是宽第一还是深度第一? 默认情况下,Scrapy使用一个LIFO队列来存储挂起的请求,这基本上意味着它按照DFO顺序爬行。在大多数情况下,这个订单更方便。如果您确实想按照真正的BFO顺序爬行,可以通过设置以下设置来完成: DEPTH_PRIORITY =1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue‘ SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue‘

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

https://stackoverflow.com/questions/35919212

复制
相关文章

相似问题

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