我是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)如何限制每个站点的爬网总数,而不考虑深度
谢谢!
答案 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()