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

gpa*_*rov 7 python web-crawler scrapy

我是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']
Run Code Online (Sandbox Code Playgroud)

这导致response.meta ['depth']总是等于零,并且cralwer只抓取start_urls的每个元素的第一个站点(即它不跟随任何链接).所以,我有两个问题1)如何抓取限制为一定深度在start_urls 2)如何限制每个网站抓取的总数不考虑深度的每个部位

谢谢 !

Ste*_*oth 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)
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

self._compile_rules()
Run Code Online (Sandbox Code Playgroud)