首页 文章

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

提问于
浏览
7

我是Scrapy的新手,我正在尝试使用CrawlSpider从文本文件中抓取多个站点 . 但是,我想限制每个网站的抓取深度以及每个网站再次抓取的抓取页面总数 . 不幸的是,当设置start_urls和allowed_domains属性时,response.meta ['depth']似乎总是为零(这似乎没有做任何事情 . 当我删除 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中将每个站点的爬网限制到一定的深度2)如何限制每个站点的爬网总数,而不管深度如何

谢谢 !

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)
    

    UPDATE:

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

    这是你没有调用CrawlSpider.init()(通过 super(DownloadSpider, self).__init__() )所缺少的逻辑:

    self._compile_rules()
    

相关问题