我正在尝试使用Scrapy实现具有以下功能的CrawlSpider。 基本上,我的开始网址包含各个部分的网址列表。我想从特定部分抓取网址,然后抓取它们。 为了做到这一点,我使用restrict_xpaths定义了我的链接提取器,以便隔离我想要从其余链接爬行的链接。 但是,由于restrict_xpaths,当蜘蛛试图抓取不是起始URL的链接时,它会停止,因为它找不到任何链接。 所以我尝试添加另一条规则,它应该通过使用应用于start_url的deny_domains来确保开始URL之外的链接被爬行。但是,此解决方案无效。 任何人都可以提出可行的策略吗 现在我的规则是:
rules = {Rule(LinkExtractor(restrict_xpaths=(".//*[@id='mw-content- text']/ul[19]"), ), callback='parse_items', follow=True),
Rule(LinkExtractor(deny_domains='...start url...'), callback='parse_items',follow= True),}
答案 0 :(得分:0)
您通过在规则对周围使用{}来定义集合。尝试用():
创建一个元组 rules = (Rule(LinkExtractor(restrict_xpaths=(".//*[@id='mw-content- text']/ul[19]"), ), callback='parse_items', follow=True),
Rule(LinkExtractor(deny_domains='...start url...'), callback='parse_items',follow= True),)
除此之外,您可能希望将“unique = True”传递给规则,以确保不会遵循返回“start url”的任何链接。见BaseSgmlLinkExtractor
此外,使用'parse_items'作为对两个LinkExtractors的回调有点气味。根据你的解释,我看不出第一个提取器需要回调....它只是提取应该添加到队列的链接,以便Scraper去取,对吧?
您想要使用/持久化的数据的真正抓取通常发生在'parse_items'回调中(至少这是文档中使用的约定)。