首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个蜘蛛上解析页面后调用另一个蜘蛛

在另一个蜘蛛上解析页面后调用另一个蜘蛛
EN

Stack Overflow用户
提问于 2019-11-07 09:58:25
回答 1查看 57关注 0票数 1

这在某种程度上已经被herehere解决了。

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

所以,基本上,我在尝试蒸汽游戏。正如您可能知道的,蒸汽有一个链接,您可以在其中访问游戏的所有评论,例如:

https://steamcommunity.com/app/730/reviews/?browsefilter=toprated&snr=1_5_100010_

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

无论如何,我已经创建了一个单独的蜘蛛,它将在这里爬行游戏列表,并且运行得很好:

https://store.steampowered.com/search/?sort_by=Released_DESC

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

最初,我创建了一个新的Spider,用于处理页面中的无限滚动,其中包含了对游戏的全部评论,但是很明显,蜘蛛需要那些评论所在的URL。

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

所以我的问题是:

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

  • ,我真的可以从另一个蜘蛛中调用蜘蛛吗?根据我在Scrapy文档中所读到的,它看起来不像它。我可能可以把所有的东西都移到一只蜘蛛身上,但是看起来很糟糕,而且它不遵守单响应的principle...

EN

回答 1

Stack Overflow用户

发布于 2019-11-07 10:36:53

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

https://docs.scrapy.org/en/latest/intro/tutorial.html#more-examples-and-patterns

代码语言:javascript
复制
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)

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

https://docs.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request.meta

Is it possible to pass a variable from start_requests() to parse() for each individual request?中的示例

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58746174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档