使用Python Scrapy爬网多个站点,每个站点的深度有限

时间:2013-04-06 01:22:11

标签: python scrapy web-crawler

我是Scrapy的新手,我正在尝试使用CrawlSpider从文本文件中抓取多个网站。但是,我想限制网站的抓取深度,以及再次每个网站的抓取网页总数。不幸的是,当设置start_urls和allowed_domains属性时,response.meta ['depth']似乎总是为零(当我试图抓取单个网站时,这不会发生)。在设置文件中设置DEPTH_LIMIT似乎根本不做任何事情。 当我删除 init 定义并简单地设置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']总是等于零,并且cralwer只抓取start_urls的每个元素的第一个站点(即它不跟随任何链接)。所以我有两个问题 1)如何在start_urls中将爬网限制在 per 每个站点的某个深度 2)如何限制每个站点的爬网总数,而不考虑深度

谢谢!

1 个答案:

答案 0 :(得分: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中的方法时,不再调用基类方法,而是调用新方法,这意味着如果您希望新逻辑另外运行 < / em>到旧逻辑(即不代替),那么你需要手动调用旧逻辑。

以下是您未通过调用CrawlSpider.__init__()(通过super(DownloadSpider, self).__init__())而遗漏的逻辑:

self._compile_rules()