Como raspar uma lista de tópicos de um subreddit usando Bash
O Reddit oferece feeds JSON para cada subreddit. Veja como criar um script Bash que faça o download e analise uma lista de postagens de qualquer subreddit desejado. Isso é apenas uma coisa que você pode fazer com os feeds JSON do Reddit.
Instalando o Curl e o JQ
Vamos use o curl para buscar o feed JSON do Reddit e jq para analisar os dados JSON e extrair os campos desejados dos resultados. Instale estas duas dependências usando apt-get no Ubuntu e outras distribuições Linux baseadas no 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 o curl para buscar as postagens mais recentes do subreddit do MildlyInteresting:
curl -s -A “exemplo de raspador do reddit” https://www.reddit.com/r/MildlyInteresting.json[/PRE ]Observe como as opções usadas antes da URL: -s forçam a ondulação a ser executada 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 personalizada do agente do usuário que ajuda o Reddit a identificar o serviço que acessa seus dados. Os servidores da API do Reddit 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 de limite de taxa HTTP 429 excedido.
A saída deve preencher a janela do terminal e parecer isto:
Existem muitos campos nos dados de saída, mas todos os que nos interessam são Título, Permalink 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
Extraindo dados da saída JSON
Queremos extrair Title, Permalink 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 sed e grep, mas temos outra ferramenta à nossa disposição que entende estruturas de dados JSON, chamadas jq. Em nossa primeira tentativa, vamos usá-lo para imprimir e codificar com cores a saída. Usaremos a mesma chamada de antes, mas, desta vez, canalizaremos a saída por meio de jq e instruiremos para analisar e analisar os dados JSON.
curl -s -A "exemplo de raspador reddit" https://www.reddit.com/r/MildlyInteresting.json | jq.Observe o período que segue o comando. Essa expressão simplesmente analisa a entrada e a imprime como está. A saída parece bem formatada e codificada por cores:
Vamos examinar a estrutura dos dados JSON que recebemos do Reddit. O resultado da raiz é um objeto que contém duas propriedades: tipo e dados. O último contém uma propriedade chamada children, que inclui uma matriz de posts para este subreddit.
Cada item na matriz é um objeto que também contém dois campos chamados kind e data. As propriedades que queremos pegar estão no objeto de dados. jq espera uma expressão que possa ser aplicada aos dados de entrada e produza a saída desejada. Ele deve descrever o conteúdo em termos de hierarquia e associação a um array, bem como como os dados devem ser transformados. Vamos executar o comando inteiro novamente com a expressão correta:
curl -s -A "Exemplo de raspador do 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 Permalink cada na sua própria linha:
Vamos mergulhar no comando jq que chamamos:
jq '.data.children | [] | .data.title, .data.url, .data.permalink 'Existem três expressões neste comando separadas por dois símbolos de pipe. Os resultados de cada expressão são passados para o próximo para posterior avaliação. 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 o jq e sua sintaxe de expressão podem ser encontradas no manual oficial do jq.
Colocando tudo junto em um script
Vamos colocar a chamada da API e o pós-processamento do JSON juntos um script que irá gerar um arquivo com as mensagens que queremos. Vamos adicionar suporte para buscar postagens de qualquer subreddit, não apenas de / r / MildlyInteresting.
Abra o seu editor e copie o conteúdo desse trecho em um arquivo chamado scrape-reddit.sh
#! / bin / bash se [-z "$ 1"], em seguida, echo "Please especifique um subreddit "exit 1 fi SUBREDDIT = $ 1 NOW = $ (date +"% m_% d_% y-% H_% M ") OUTPUT_FILE =" $ _ $. txt "curl -s -A" bash-scrape-topics "https://www.reddit.com/r/$.json | \ jq '.data.children | [] | .data.title, .data.url, .data.permalink '| \ while ler -r TITLE; faça a leitura -r URL ler -r PERMALINK echo -e "$ \ t $ \ t $" | tr --delete \ "> > $ doneEste script verificará primeiro se o usuário forneceu um nome de subreddit. Se não, sairá com uma mensagem de erro e um código de retorno diferente de zero.
Em seguida, ele armazenará o primeiro argumento como o nome subreddit e criará um nome de arquivo com data e data em que a saída será salva.
A ação começa quando curl é chamado com um cabeçalho personalizado e a URL do subreddit para raspar.A saída é canalizada para jq, onde é analisada e reduzida a três campos: Título, URL e Permalink.Estas linhas são lidas, uma de cada vez, e salvas em um 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, delimitada por um caractere de tabulação e, em seguida, canaliza-a Comando tr para que as aspas duplas possam ser removidas.A saída é então anexada a um arquivo.
Antes de podermos executar este script, devemos garantir que ele tenha sido grante d permissões de execução. Use o comando chmod para aplicar essas permissões ao arquivo:
chmod u + x scrape-reddit.shE, por último, execute o script com um nome de subreddit:
./ scrape-reddit.sh MildlyInterestingUm arquivo de saída é gerado no mesmo diretório e seu conteúdo será parecido com este:
Cada linha contém os três campos, separados por um caractere de tabulação.
Indo além
O Reddit é uma mina de ouro de conteúdo e mídia interessante, e tudo é facilmente acessado usando sua API JSON. Agora que você tem uma maneira de acessar esses dados e processar os resultados, você pode fazer coisas como:
- Pegue as últimas manchetes do / r / WorldNews e envie-as para a sua área de trabalho usando o comando notify-send
- Integre as melhores piadas de / r / DadJokes na mensagem do dia do seu sistema
- Obtenha a melhor foto de hoje de / r / aww e crie o plano de fundo da sua área de trabalho
Tudo isso é possível usando os dados fornecidos e as ferramentas que você tem em seu sistema. Hacker feliz!
Via: How to Geek
Nenhum comentário