【问题标题】:Efficient way to scrape Reddit using praw?使用 praw 抓取 Reddit 的有效方法?
【发布时间】:2022-02-01 15:07:48
【问题描述】:

我正在开展一个项目,该项目涉及抓取 cmets,然后针对非常大 (10k+) 的一组术语应用情绪分析。实际上,每期要抓取的评论数量并没有那么大,我只想检索过去 1 周(或者最多 1 个月)的 cmets。但是,我发现速度相当令人失望。例如,即使是下面这个非常简单的 sn-p 也会运行 3 分钟以上。假设这样的速度和总共 14,000 个术语,我的代码需要连续运行一个多月才能完成任务!

term = "fastly stock fsly"
results = reddit.subreddit("all").search(term, sort="comments", limit=None)

for submission in results:
    for top_level_comment in submission.comments:
        if not isinstance(top_level_comment, praw.models.MoreComments):
            if all(word for word in term.lower().split() if word in top_level_comment.body.lower()):
                print(top_level_comment.body)

是否有机会显着缩短处理时间?我看到双 for 循环是一个糟糕的结构,但不太确定是否可以在这里避免。此外,我知道内部 for 循环会遍历一个可能很长的列表,尽管我很可能只需要前 10-20 个 cmets,但我不清楚是否可以应用 subreddit.search() for一个特定的时间段。我在文档中没有看到任何参数。

【问题讨论】:

    标签: python reddit praw


    【解决方案1】:

    您可以做的减少一些时间的方法是将term.lower().split() 更改为您可以引用的列表,而不是尝试在 for 循环中每次都拆分字符串(造成额外浪费的处理时间)。

    如果您希望提高速度,则最好使用 try-catch 块而不是 isinstance,因为 try-catch 是 Python 语言并且与 isinstance 相比进行了高度优化。

    通过该调整,您仍然有 3 个嵌套的 for 循环,时间复杂度为 N^3。

    term = "fastly stock fsly"
    terms = term.lower().split()
    results = reddit.subreddit("all").search(term, sort="comments", limit=None)
        
    for submission in results:
        for top_level_comment in submission.comments:
            try:
                if all(word for word in terms if word in top_level_comment.body.lower()):
                    print(top_level_comment.body)
            except AttributeError:
                pass
    

    至于您的 if all() 语句,如果有一个匹配的单词,它将始终评估为 true,我不确定这是否是您想要的意思,因为如果是这样,那么有办法更快地打破搜索(当它在您的列表中找到第一个匹配的单词时)

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 2020-10-17
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2020-08-16
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多