用Python编程建立一个Reddit网络搜刮器

982 阅读6分钟

Reddit是无数社区、无休止的讨论和真正的人类联系的家园。Reddit有一个适合各种兴趣的社区,包括突发新闻、体育、电视粉丝理论,以及源源不断的互联网最漂亮的动物。

使用Python的PRAW(Python Reddit API Wrapper)包,本教程将演示如何从Reddit中抓取数据。PRAW是Reddit API的一个Python包装器,允许你从subreddits中抓取数据,开发机器人,以及更多。

在本教程结束时,我们将尝试从subreddit中刮取尽可能多的Python相关数据,并获得Reddit用户对Python的真实评价。让我们开始享受乐趣吧


简介

顾名思义,它是一种 "搜刮 "或从在线网页中提取数据的技术。在互联网上使用网络浏览器可以看到的一切,包括本指南,都可以被刮到本地硬盘上。网络搜刮有许多应用。数据采集是任何数据分析的第一个阶段。互联网是所有人类历史和知识的巨大宝库,你有能力提取任何你想要的信息,并按你认为合适的方式使用它。

虽然有各种技术可以从Reddit刮取数据,但PRAW简化了这个过程。它遵守所有Reddit的API要求,并消除了开发人员代码中的睡眠调用需求。在安装搜刮器之前,必须设置Reddit搜刮器的认证。下面列出了各自的步骤。


Reddit搜刮器的认证步骤

使用PRAW工作需要认证。为了实现这一目标,我们将采取以下步骤。

  1. 按照这个链接 访问Reddit开发者账户。
  2. 滚动到页面底部,找到 "你是开发者吗?"按钮,开发一个应用程序。
  3. 下一步是建立一个应用程序,填写表格,并开发应用程序。
  4. 这将带你到一个包含刮削器所需的所有信息的页面。

001 刮削器步骤1

对于重定向URL,你应该选择 http://localhost:8080.完成后点击创建应用程序按钮。

001 刮削器步骤2

现在,认证阶段已经完成,我们将在下一步进入Reddit搜刮器的实施阶段。


刮削器的实施

这一部分将解释你为获得本教程旨在获得的数据所必须做的一切。我们将首先在程序文件中导入所有需要的模块和库。在导入PRAW库之前,我们必须在命令提示符下执行以下一行来安装PRAW。

pip install praw

现在PRAW已经成功安装,下面的代码片段可以用来将PRAW和其他所需的库一起导入。

import praw
import pandas as pd
from praw.models import MoreComments


我们刚刚完成的认证程序将立即发挥作用。在利用PRAW刮取任何数据之前,我们必须在软件中进行认证。这可以通过创建一个Reddit实例或一个授权实例来完成。

在本指南中,我们将创建一个授权实例,它将允许我们用我们的Reddit账户执行任何我们想要的行动。你只需要向该实例提供一个客户端ID、客户端秘密、用户代理、用户名和密码。检查下面的代码片段(填入你的密钥,而不是空白字符串)。

reddit_authorized = praw.Reddit(client_id=" ",
                                client_secret=" ",
                                user_agent=" ",
                                username=" ",
                                password=" ")


我们的目标是找到redditors在平台上谈论的Python,但万一你改变主意,想知道其他的东西,我们将从用户本身获得关于这个话题的输入。请看下面的代码片段。

name_subreddit = input("Enter the name of Sub-reddit : ")

使用下面的代码,我们接下来将尝试使用我们之前生成的实例对象来获得对subreddit的访问。此外,我们将提供一些关于子红点的基本信息,以检查我们是否有权限。

subreddit = reddit_authorized.subreddit(name_subreddit)
print("Display Name:", subreddit.display_name)
print("Title:", subreddit.title)
print("Description:", subreddit.description)

我们将在接下来的代码片段中尝试提取顶部的每周、每月和每年的帖子,以了解什么是该主题的最重要的帖子。我们将在提取的帖子对象的for循环的帮助下,提取帖子的标题、评论数和帖子的URL。

为了使分析更容易,我们将把数据转换成数据框架。下面的代码将提取本周关于该主题的顶级帖子。

posts = subreddit.top("week")

posts_dict = {"Title": [],
              "Total Comments": [],
              "Post URL": []}

for post in posts:
	posts_dict["Title"].append(post.title)
	posts_dict["Total Comments"].append(post.num_comments)
	posts_dict["Post URL"].append(post.url)

top_posts_week = pd.DataFrame(posts_dict)

print("Number of posts extracted : ",top_posts_week.shape[0])
top_posts_week.head()

输出结果看起来有点像下面所示,你可以看到我们能够提取100个帖子的数据。

002 每周热门帖子 Reddit

下一个代码段将获得该主题的每月热门帖子。你所需要改变的只是subreddit.top 函数的参数。

posts = subreddit.top("month")

posts_dict = {"Title": [],
              "Total Comments": [],
              "Post URL": []}

for post in posts:
	posts_dict["Title"].append(post.title)
	posts_dict["Total Comments"].append(post.num_comments)
	posts_dict["Post URL"].append(post.url)

top_posts_month = pd.DataFrame(posts_dict)

print("Number of posts extracted : ",top_posts_month.shape[0])
top_posts_month.head()

请看一下通过代码提取的每月热门帖子。

003 Reddit每月热门帖子

最后,下面的代码片段将获得关于该主题的一年中的顶级帖子。同样,你所需要改变的是subreddit.top 函数的参数。

posts = subreddit.top("year")

posts_dict = {"Title": [],
              "Total Comments": [],
              "Post URL": []}

for post in posts:
	posts_dict["Title"].append(post.title)
	posts_dict["Total Comments"].append(post.num_comments)
	posts_dict["Post URL"].append(post.url)

top_posts_year = pd.DataFrame(posts_dict)

print("Number of posts extracted : ",top_posts_year.shape[0])
top_posts_year.head()

请看一下通过上述代码提取的年度热门帖子。

004年顶级年度帖子 Reddit

最后,让我们也尝试使用下面的代码片段,在帖子URL的帮助下,提取一个帖子的所有评论。这将有助于了解人们对Python上的帖子是如何反应的。

我们将从每个月发表的最受欢迎的Python文章的初始帖子中提取最佳评论。要实现这个目标,需要用到praw模块下的MoreComments。

url = top_posts_month['Post URL'][0]
submission = reddit_authorized.submission(url=url)

post_comments = []
for comment in submission.comments:
	if type(comment) == MoreComments:
		continue
	post_comments.append(comment.body)

comments_df = pd.DataFrame(post_comments, columns=['comment'])

print("Number of Comments : ",comments_df.shape[0])
comments_df.head()

请看下图中为帖子提取的所有44条评论。

005 评论 Reddit 输出


总结

Praw是Reddit API的一个Python封装器,允许我们用一个简单的Python界面来使用Reddit API。该API可用于网络抓取、机器人创建和其他用途。这个教程涉及认证,从一个子Reddit中检索最受欢迎的每周、每月和每年的帖子,以及提取帖子的评论。

我希望你喜欢这篇文章,如果你喜欢,我建议你也看看下面的教程。

  1. Python Selenium介绍和设置
  2. 使用Selenium从网页上获取数据[完整指南]。
  3. 如何使用Scrapy在Python中抓取雅虎金融数据