Scrapy 在另一个Spider上解析页面后调用另一个Spider

Scrapy 在另一个Spider上解析页面后调用另一个Spider,scrapy,Scrapy,这在一定程度上得到了解决,并且 但在做任何建议之前,我想在这里问一下,因为我真的不喜欢任何方法 因此,基本上,我正在尝试抓取Steam游戏。您可能知道,Steam有一个链接,您可以在其中访问游戏的全部评论,例如: _ 您可以忽略snr和browsefilter查询参数 无论如何,我已经创建了一个蜘蛛,它可以在这里抓取游戏列表,并且运行得非常好: 但是现在,对于每一个游戏,我想检索所有的评论 最初,我创建了一个新的Spider,它处理页面中的infinte滚动,页面上有一整套游戏评论,但显然,S

这在一定程度上得到了解决,并且

但在做任何建议之前,我想在这里问一下,因为我真的不喜欢任何方法

因此,基本上,我正在尝试抓取Steam游戏。您可能知道,Steam有一个链接,您可以在其中访问游戏的全部评论,例如:

_

您可以忽略snr和browsefilter查询参数

无论如何,我已经创建了一个蜘蛛,它可以在这里抓取游戏列表,并且运行得非常好:

但是现在,对于每一个游戏,我想检索所有的评论

最初,我创建了一个新的Spider,它处理页面中的infinte滚动,页面上有一整套游戏评论,但显然,Spider需要这些评论所在的URL

所以基本上我现在做的是刮取所有游戏页面,并将每个游戏的评论URL存储在一个txt文件中,然后作为参数传递给第二个蜘蛛。但是我不喜欢这个,因为它迫使我做一个两步的过程,而且,我需要以某种方式将第二个蜘蛛的结果映射到第一个蜘蛛的结果(这个评论属于这个游戏,等等)

因此,我的问题是:

  • 最好将抓取游戏页面的结果(以及包含所有评论的URL)发送给第二个蜘蛛,或者至少发送URL,然后使用第二个蜘蛛获取每个游戏的所有评论?就性能而言,这将是O(N*M),每个游戏有N个游戏和M个评论,也许正因为如此,拥有2个蜘蛛是值得的…想法

  • 我可以从另一个蜘蛛调用一个蜘蛛吗?从我在残缺不全的文档中读到的,看起来不像。我可能会把所有的东西移到一只蜘蛛身上,但看起来很糟糕,而且它不符合单一责任原则


    • 为什么不使用不同的解析过程

      并使用meta标记添加所需的值:

      举例

      Hmmm,记住检索评论需要几个请求,这就是为什么我为它创建了一个不同的爬行器,这样我就可以解析每个无限滚动结果的结果……在这种情况下,这将如何应用?在第二个parce过程中完成无止境滚动的循环。最后,你做了与解析“跟随分页链接”中相同的自调用。老实说,我不知道如果没有爬行器,你会如何在评论页面上迭代?除非我在第二个解析方法上做一个循环并复制start_请求的内容,否则parse会在爬行器上做…这就是你的建议吗?我已经在第二个解析过程中添加了分页我认为这对我的情况不起作用,我会在下一个页面调用表单进行审阅,在解析审阅时我没有到下一个页面的链接,这是一个无限的卷轴。。。
      def parse(self, response):
          # follow links to author pages
          for href in response.css('.author + a::attr(href)'):
              yield response.follow(href, self.parse_author)
      
          # follow pagination links
          for href in response.css('li.next a::attr(href)'):
              yield response.follow(href, self.parse)
      
      def parse_author(self, response):
          def extract_with_css(query):
              return response.css(query).get(default='').strip()
      
          yield {
              'name': extract_with_css('h3.author-title::text'),
              'birthdate': extract_with_css('.author-born-date::text'),
              'bio': extract_with_css('.author-description::text'),
          }
      
          # follow pagination links
          for href in response.css('li.next a::attr(href)'):
             yield response.follow(href, self.parse_author)