【问题标题】:Using Scrapy to crawl a list of urls in a section of the start url使用 Scrapy 抓取起始 url 部分中的 url 列表
【发布时间】:2015-04-21 17:12:43
【问题描述】:

我正在尝试使用具有以下功能的 Scrapy 实现 CrawlSpider。 基本上,我的起始 url 包含不同部分的 url 列表。我想只从特定部分抓取网址,然后抓取它们。 为了做到这一点,我使用restrict_xpaths 定义了我的链接提取器,以便将我想要抓取的链接与其他链接隔离开来。 然而,由于restrict_xpaths,当蜘蛛试图抓取一个不是起始URL 的链接时,它会停止,因为它没有找到任何链接。 所以我尝试添加另一个规则,该规则应该通过使用应用于 start_url 的拒绝域来确保开始 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),}

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您通过在这对规则周围使用 {} 来定义一个 Set。尝试使用 () 将其设为元组:

     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”传递给规则,以确保不遵循任何返回“起始 url”的链接。见BaseSgmlLinkExtractor

    此外,使用 'parse_items' 作为对两个 LinkExtractors 的回调有点异味。根据您的解释,我看不到第一个提取器需要回调......它只是提取应该添加到队列中以便 Scraper 获取的链接,对吗?

    您想要使用/保留的数据的真正抓取通常发生在“parse_items”回调中(至少这是文档中使用的约定)。

    【讨论】:

    • 谢谢,您的建议解决了我的问题。这可能是因为括号。但是,有些事情对我来说似乎有点不清楚,我想了解为什么会这样。首先,unique参数到底是做什么的?在文档中它谈到了重复过滤,但我不确定这意味着什么。其次,如果你摆脱第一条规则的回调,我不太确定会发生什么。基本上,当找到遵循第一条规则的链接时会发生什么?
    • 唯一标志确保一个 URL 只被蜘蛛匹配一次。每次匹配都会调用回调函数。回调函数传递与请求 URL 相关的响应:doc.scrapy.org/en/latest/topics/spiders.html#crawling-rules
    • 现在我可以接受唯一标志了。关于第一条规则中缺少的回调,即使没有指定,也会为每个 url 调用它??
    • 是的,我想我知道它是如何工作的,如果我错了,请纠正我。基本上,一开始只匹配第一条规则并遵循链接。然后对于每个链接,再次评估规则,第二个规则与链接匹配,因此调用 parse_item 并爬取内容。但是这样做,我不会跳过链接主页的内容吗??
    • 通常你会使用两个不同的回调......一个只会返回可以遵循的请求,另一个将返回已被抓取的项目。文档对此非常清楚。如果您需要更多信息,我建议您发布另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多