7

我是 Scrapy 的新手,我正在尝试使用 CrawlSpider 从文本文件中抓取多个站点。但是,我想限制每个站点的抓取深度以及每个网站再次抓取的页面总数。不幸的是,当 start_urls 和 allowed_domains 属性设置时 response.meta['depth'] 似乎总是为零(当我试图抓取单个站点时不会发生这种情况)。在设置文件中设置 DEPTH_LIMIT 似乎根本没有做任何事情。当我删除初始化定义并简单地设置 start_urls 和 allowed_domains 事情似乎工作正常。这是代码(抱歉缩进 - 这不是问题):

class DownloadSpider(CrawlSpider):
  name = 'downloader'
  rules = (
    Rule(SgmlLinkExtractor(), callback='parse_item', follow=True),
    )
  def __init__(self, urls_file, N=10):
      data = open(urls_file, 'r').readlines()[:N]
      self.allowed_domains = [urlparse(i).hostname.strip() for i in data] 
      self.start_urls = ['http://' + domain for domain in self.allowed_domains]

  def parse_start_url(self, response):
      return self.parse_item(response)

  def parse_item(self, response):
      print response.url
      print response.meta['depth']

这导致 response.meta['depth'] 始终等于 0,并且 cralwer 仅抓取 start_urls 的每个元素的第一个站点(即它不跟随任何链接)。所以我有两个问题 1)如何在 start_urls 中将每个站点的爬网限制为一定的深度2)如何限制每个站点的爬网总数,而不管深度如何

谢谢 !

4

1 回答 1

2

不要忘记调用基类构造函数(例如使用super):

def __init__(self, urls_file, N=10, *a, **kw):
    data = open(urls_file, 'r').readlines()[:N]
    self.allowed_domains = [urlparse(i).hostname.strip() for i in data]
    self.start_urls = ['http://' + domain for domain in self.allowed_domains]
    super(DownloadSpider, self).__init__(*a, **kw)

更新:

当您在 Python 中覆盖一个方法时,不再调用基类方法而是调用您的新方法,这意味着如果您希望新逻辑在旧逻辑之外运行(即不是代替),那么您需要手动调用旧逻辑。

这是您因不调用CrawlSpider.__init__()(via super(DownloadSpider, self).__init__()) 而丢失的逻辑:

self._compile_rules()
于 2013-04-06T14:52:59.320 回答