【问题标题】:Crawling multiple sites with Python Scrapy with limited depth per site使用 Python Scrapy 抓取多个站点,每个站点的深度有限
【发布时间】:2013-03-28 13:56:48
【问题描述】:

我是 Scrapy 的新手,我正在尝试使用 CrawlSpider 从文本文件中抓取多个站点。但是,我想限制 per 网站的抓取深度以及再次 per 网站的抓取页面总数。不幸的是,当 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'] 始终等于 0,并且 cralwer 仅抓取 start_urls 的每个元素的第一个站点(即它不跟随任何链接)。所以我有两个问题 1) 如何在 start_urls 中限制每个站点的爬取到一定深度per 2)如何限制每个站点的总爬取次数,而不考虑深度

谢谢!

【问题讨论】:

  • 看来问题出在您将参数传递给蜘蛛的部分。如果将其删除,则爬虫可以在 DEPTH_LIMIT 设置下正常工作。然而,这使得它在为它提供一组不断变化的网站以进行抓取时非常低效

标签: python scrapy web-crawler


【解决方案1】:

不要忘记调用基类构造函数(例如使用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__()(通过super(DownloadSpider, self).__init__())而丢失的逻辑:

self._compile_rules()

【讨论】:

  • 谢谢。这修复了它(虽然我仍然不知道为什么 - 我将继续梳理scrapy中的文档)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2019-11-16
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多