Como raspar uma lista de tópicos de um subreddit usando o Bash

Terminal Linux no conceito de laptop Ubuntu
Fatmawati Achmad Zaenuri / Shutterstock.com

O Reddit oferece feeds JSON para cada subreddit. Veja como criar um script Bash que baixa e analisa uma lista de postagens de qualquer subreddit de sua preferência. Isso é apenas uma coisa que você pode fazer com os feeds JSON do Reddit.

Instalando Curl e JQ

Vamos usar curlpara buscar o feed JSON do Reddit,   jqanalisar os dados JSON e extrair os campos que queremos dos resultados. Instale essas duas dependências usando apt-get Ubuntu e outras distribuições Linux baseadas em Debian. Em outras distribuições Linux, use a ferramenta de gerenciamento de pacotes da sua distribuição.

sudo apt-get install curl jq

Buscar alguns dados JSON do Reddit

Vamos ver como é o feed de dados. Use curlpara buscar as últimas postagens do subreddit MildlyInteresting :

curl -s -Um “exemplo de raspador de reddit” https://www.reddit.com/r/MildlyInteresting.json

Observe como as opções usadas antes do URL: -sforça o curl a ser executado no modo silencioso para que não vejamos nenhuma saída, exceto os dados dos servidores do Reddit. A próxima opção e o parâmetro a seguir -A “reddit scraper example”,, define uma string de agente do usuário personalizada que ajuda o Reddit a identificar o serviço acessando seus dados. Os servidores Reddit API aplicam limites de taxa com base na string do agente do usuário. Definir um valor personalizado fará com que o Reddit segmente nosso limite de taxa longe de outros chamadores e reduza a chance de obtermos um erro HTTP 429 Limite de taxa excedido.

Recomendado:  Como verificar a versão do BIOS e atualizá-la

A saída deve preencher a janela do terminal e ser semelhante a esta:

Raspe um subreddit do Bash

Existem muitos campos nos dados de saída, mas estamos interessados ​​apenas em Título, Link permanente e URL. Você pode ver uma lista exaustiva de tipos e seus campos na página de documentação da API do Reddit: https://github.com/reddit-archive/reddit/wiki/JSON

Extração de dados da saída JSON

Queremos extrair Título, Link permanente e URL dos dados de saída e salvá-los em um arquivo delimitado por tabulação. Podemos usar ferramentas de processamento de texto como sede grep, mas temos outra ferramenta à nossa disposição que entende estruturas de dados JSON, chamada   jq. Para nossa primeira tentativa, vamos usá-lo para imprimir e codificar com cores a saída. Usaremos a mesma chamada de antes, mas desta vez, canalize a saída   jqe instrua-a a analisar e imprimir os dados JSON.

curl -s -A “exemplo de raspador de reddit” https://www.reddit.com/r/MildlyInteresting.json | jq.

Observe o período após o comando. Esta expressão simplesmente analisa a entrada e a imprime como está. A saída parece bem formatada e codificada por cores:

Extraia dados de JSON de um subreddit no Bash

Vamos examinar a estrutura dos dados JSON que recebemos do Reddit. O resultado raiz é um objeto que contém duas propriedades: tipo e dados. O último contém uma propriedade chamada children, que inclui uma matriz de postagens para este subreddit.

Cada item da matriz é um objeto que também contém dois campos chamados tipo e dados. As propriedades que queremos obter estão no objeto de dados.  jqespera uma expressão que pode ser aplicada aos dados de entrada e produz a saída desejada. Deve descrever o conteúdo em termos de sua hierarquia e associação a um array, bem como como os dados devem ser transformados. Vamos executar todo o comando novamente com a expressão correta:

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

A saída mostra Título, URL e Link permanente, cada um em sua própria linha:

Recomendado:  Como gerar texto aleatório no Word

Analisa o conteúdo de um subreddit da linha de comando do Linux

Vamos mergulhar no   jqcomando que chamamos:

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

Existem três expressões neste comando separadas por dois símbolos de barra vertical. Os resultados de cada expressão são passados ​​para a próxima para avaliação posterior. A primeira expressão filtra tudo, exceto a matriz de listagens do Reddit. Essa saída é canalizada para a segunda expressão e forçada para uma matriz. A terceira expressão atua em cada elemento da matriz e extrai três propriedades. Mais informações sobre   jqe sua sintaxe de expressão podem ser encontradas no manual oficial do jq .

Juntando tudo em um script

Vamos colocar a chamada API e o pós-processamento JSON juntos em um script que irá gerar um arquivo com os posts que queremos. Adicionaremos suporte para buscar postagens de qualquer subreddit, não apenas / r / MildlyInteresting.

Abra seu editor e copie o conteúdo deste trecho em um arquivo chamado scrape-reddit.sh

#! / bin / bash

if [-z "$ 1"]
  então
    echo "Especifique um subreddit"
    saída 1
fi

SUBREDDIT = $ 1
AGORA = $ (data + "% m_% d_% y-% H_% M")
OUTPUT_FILE = "$ {SUBREDDIT} _ $ {NOW} .txt"

curl -s -A "bash-scrape-topics" https://www.reddit.com/r/${SUBREDDIT}.json | \
        jq '.data.children | . [] | .data.title, .data.url, .data.permalink '| \
        enquanto lê -r TITLE; Faz
                read -r URL 
                ler -r PERMALINK
                echo -e "$ {TITLE} \ t $ {URL} \ t $ {PERMALINK}" | tr - excluir \ ">> $ {OUTPUT_FILE}
        feito

Este script verificará primeiro se o usuário forneceu um nome de subreddit. Caso contrário, ele sai com uma mensagem de erro e um código de retorno diferente de zero.

Em seguida, ele armazenará o primeiro argumento como o nome do subreddit e criará um nome de arquivo com carimbo de data onde a saída será salva.

A ação começa quando curlé chamada com um cabeçalho personalizado e a URL do subreddit a ser copiado. A saída é canalizada para   jqonde é analisada e reduzida a três campos: Título, URL e Link permanente. Essas linhas são lidas, uma de cada vez, e salvas em uma variável usando o comando read, tudo dentro de um loop while, que continuará até que não haja mais linhas para ler. A última linha do bloco while interno ecoa os três campos, delimitados por um caractere de tabulação e, em seguida, canaliza-o através do trcomando para que as aspas duplas possam ser removidas. A saída é então anexada a um arquivo.

Recomendado:  15 videogames para experimentar se você não joga

Antes de podermos executar este script, devemos garantir que ele tenha recebido permissões de execução. Use o   chmodcomando para aplicar essas permissões ao arquivo:

chmod u + x scrape-reddit.sh

E, por último, execute o script com um nome de subreddit:

./scrape-reddit.sh MildlyInteresting

Um arquivo de saída é gerado no mesmo diretório e seu conteúdo será semelhante a este:

Raspar e visualizar tópicos de um subreddit no Bash

Cada linha contém os três campos que procuramos, separados por um caractere de tabulação.

Indo além

O Reddit é uma mina de ouro de conteúdo e mídia interessantes, e é facilmente acessado usando sua API JSON. Agora que você tem uma maneira de acessar esses dados e processar os resultados, pode fazer coisas como:

  • Pegue as últimas manchetes de / r / WorldNews e envie-as para sua área de trabalho usando notificar-enviar
  • Integre as melhores piadas de / r / DadJokes na mensagem do dia do seu sistema
  • Obtenha a melhor imagem de hoje em / r / aww e transforme-a no plano de fundo da sua área de trabalho

Tudo isso é possível usando os dados fornecidos e as ferramentas que você possui em seu sistema. Feliz hackeamento!