使用Scrapy在开始URL的一部分中抓取URL列表

时间:2015-04-21 17:12:43

标签: python scrapy

我正在尝试使用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),}

1 个答案:

答案 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'回调中(至少这是文档中使用的约定)。