如何使用Bash从Subreddit中删除主题列表

Ubuntu膝上型计算机概念的Linux终端Fatmawati Achmad Zaenuri / Shutterstock.com

Reddit为每个subreddit提供JSON提要。以下是如何创建一个Bash脚本,用于下载和解析您喜欢的任何subreddit中的帖子列表。这只是你可以用Reddit的JSON提要做的一件事。

安装Curl和JQ

我们打算用 卷曲 从Reddit获取JSON提要 JQ 解析JSON数据并从结果中提取我们想要的字段。使用安装这两个依赖项 apt-get的 在Ubuntu和其他基于Debian的Linux发行版上。在其他Linux发行版上,请使用您的发行版的包管理工具。

sudo apt-get install curl jq

从Reddit获取一些JSON数据

让我们看看数据Feed的样子。使用 卷曲 从MildlyInteresting subreddit获取最新帖子:

curl -s -A“reddit scraper example”https://www.reddit.com/r/MildlyInteresting.json

请注意URL之前使用的选项: -s 强制curl以静默方式运行,这样我们就看不到任何输出,除了来自Reddit服务器的数据。下一个选项和后面的参数, - 一个“reddit scraper example” ,设置一个自定义用户代理字符串,帮助Reddit识别访问其数据的服务。 Reddit API服务器根据用户代理字符串应用速率限制。设置自定义值将导致Reddit将我们的速率限制与其他调用者分开,并降低我们获得HTTP 429速率限制超出错误的可能性。

输出应该填满终端窗口,看起来像这样:

从Bash刮掉一个subreddit

输出数据中有很多字段,但我们感兴趣的是Title,Permalink和URL。您可以在Reddit的API文档页面上看到类型及其字段的详尽列表:https://github.com/reddit-archive/reddit/wiki/JSON

从JSON输出中提取数据

我们想从输出数据中提取Title,Permalink和URL,并将其保存到制表符分隔文件中。我们可以使用像文本处理工具 SEDgrep的 ,但是我们有另一种工具可以理解JSON数据结构 JQ 。对于我们的第一次尝试,让我们使用它来对输出进行漂亮打印和颜色编码。我们将使用与之前相同的调用,但这一次,通过管道输出 JQ 并指示它解析和打印JSON数据。

curl -s -A“reddit scraper example”https://www.reddit.com/r/MildlyInteresting.json | jq。

请注意命令后面的句点。此表达式只是解析输入并按原样打印它。输出看起来格式和颜色编码:

从Bash中的subreddit的JSON中提取数据

让我们检查一下从Reddit返回的JSON数据的结构。根结果是一个包含两个属性的对象:kind和data。后者拥有一个名为的财产 孩子,其中包括此subreddit的一系列帖子。

数组中的每个项目都是一个对象,它还包含两个名为kind和data的字段。我们想要获取的属性位于数据对象中。 JQ 期望一个表达式可以应用于输入数据并产生所需的输出。它必须根据数组的层次结构和成员资格来描述内容,以及如何转换数据。让我们用正确的表达式再次运行整个命令:

curl -s -A“reddit scraper example”https://www.reddit.com/r/MildlyInteresting.json | jq'.data.children | 。[] | .data.title,.data.url,.data.permalink'

输出在各自的行中显示标题,URL和永久链接:

从Linux命令行解析subreddit的内容

让我们深入了解 JQ 我们叫的命令:

jq'.data.children | 。[] | .data.title,.data.url,.data.permalink'

此命令中有三个表达式,由两个管道符号分隔。将每个表达式的结果传递给下一个以进行进一步评估。第一个表达式过滤掉除Reddit列表数组之外的所有内容。此输出通过管道传输到第二个表达式并强制进入数组。第三个表达式作用于数组中的每个元素,并提取三个属性。有关的更多信息 JQ 它的表达式语法可以在jq的官方手册中找到。

将它们全部放在一个脚本中

让我们将API调用和JSON后处理放在一个脚本中,该脚本将生成一个包含我们想要的帖子的文件。我们将添加对从任何subreddit获取帖子的支持,而不仅仅是/ r / MildlyInteresting。

打开编辑器并将此代码段的内容复制到名为scrape-reddit.sh的文件中

#!/斌/庆典

如果 [ -z “$1” ]
然后
    echo“请指定一个subreddit”
    退出1
科幻

版(Subreddit)= $ 1
现在= $(日期+“%m_%d_%y-%H_%M”)
OUTPUT_FILE = “$ 版(Subreddit)_ $ 现在 .TXT”

curl -s -A“bash-scrape-topics”https://www.reddit.com/r/$SUBREDDIT.json |
        jq'.data.children | 。[] | .data.title,.data.url,.data.permalink'|
        同时读-r TITLE;做
                读-r URL
                读-r PERMALINK
                echo -e“$ TITLE t $ URL t $ PERMALINK”| tr –delete “>> $ OUTPUT_FILE
        DONE

此脚本将首先检查用户是否提供了subreddit名称。如果没有,它将退出并显示错误消息和非零返回码。

接下来,它将第一个参数存储为subreddit名称,并构建一个日期戳文件名,其中将保存输出。

行动开始时 卷曲 使用自定义标头和要删除的subreddit的URL调用。输出通过管道输送到 JQ 它被解析并减少到三个字段:标题,URL和永久链接。这些行一次一个地读取,并使用read命令保存到变量中,所有这些都在while循环内部,这将持续到没有更多行要读取。内部while块的最后一行回显三个字段,由制表符分隔,然后通过它进行管道传输 TR 命令,以便可以删除双引号。然后将输出附加到文件。

在我们执行此脚本之前,我们必须确保它已被授予执行权限。使用 CHMOD 命令将这些权限应用于该文件:

chmod u + x scrape-reddit.sh

最后,使用subreddit名称执行脚本:

./scrape-reddit.sh MildlyInteresting

输出文件生成在同一目录中,其内容如下所示:

从Bash中的subreddit中抓取并查看主题

每行包含我们追求的三个字段,使用制表符分隔。

走得更远

Reddit是一个有趣的内容和媒体的金矿,它可以使用它的JSON API轻松访问。既然您有办法访问这些数据并处理结果,您可以执行以下操作:

  • 从/ r / WorldNews获取最新标题,并使用notify-send将它们发送到您的桌面
  • 将/ r / DadJokes中最好的笑话集成到系统的每日消息中
  • 从/ r / aww获取今日最佳图片,并将其作为桌面背景

所有这些都可以使用您提供的数据和系统上的工具。快乐的黑客!

本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。