Tutorial de raspagem na Web em R

Alguns dias atrás, Kevin Markham da Data School , publicou um bom tutorial sobre raspagem na web usando 16 linhas de código Python.

Web raspando as mentiras do presidente em 16 linhas de Python
Nota: Este tutorial está disponível como um notebook Jupyter, e o conjunto de dados de mentiras está disponível como um arquivo CSV, ambos … www.dataschool.io

O tutorial é simples e muito bem feito. Eu encorajo-lhe fortemente a examiná-lo. Na verdade, esse tutorial me motivou a replicar os resultados, mas desta vez usando R. Com a permissão de Kevin, usarei um layout semelhante ao de sua postagem no blog. Além disso, vou usar o mesmo site sobre um artigo de opinião chamado Trump's Lies . Isso deve facilitar qualquer comparação entre as duas abordagens.

Examinando o artigo do New York Times

Para uma boa descrição sobre o artigo com o qual trabalharemos, encorajo-vos a dar uma olhada no tutorial de Kevin. Em resumo, os dados que nos interessam consistem em um registro de mentiras, cada uma com 4 partes:

  • A data da mentira
  • A própria mentira
  • Uma explicação de por que era uma mentira
  • Um URL para um artigo que suporte a explicação (incorporada no texto)

Os dados que queremos extrair da página da Web.

Lendo a página da web em R

Para ler a página da Web em R, podemos usar o pacote mais rasteiro , feito pelo R Guru Hadley Wickham . Este pacote é inspirado em bibliotecas como o Beautiful Soup , para facilitar a compilação de dados de páginas web html. A primeira função importante a usar é read_html() , que retorna um documento XML que contém todas as informações sobre a página da Web.

Coletando todos os registros

Conforme explicado no tutorial de Kevin, cada registro possui a seguinte estrutura no código HTML:

<span class="short-desc"><strong> DATE </strong> LIE <span class="short-truth"><a href="URL"> EXPLANATION </a></span></span>

Portanto, para coletar todas as mentiras, precisamos identificar todas as tags <span> que pertencem à class="short-desc" . A função que nos ajudará a fazer isso é html_nodes() . Esta função requer o documento XML que lemos e os nós que queremos selecionar. Para o posterior, é encorajado a usar o SelectorGadget , uma ferramenta de código aberto que facilita a geração e a descoberta do seletor CSS. Usando essa ferramenta, descobrimos que todas as mentiras podem ser selecionadas usando o seletor ".short-desc" .

Isso retorna uma lista com 116 nós XML que contêm informações para cada uma das 116 mentiras na página da Web.

Observe que estou usando o operador %>% do pacote magrittr , o que pode ajudar a expressar operações complexas como pipelines elegantes, compostas por peças simples e facilmente compreendidas.

Extraindo a data

Vamos começar simples e concentrar-nos em extrair todos os detalhes necessários da primeira mentira. Podemos então estender isso a todos os outros facilmente. Lembre-se de que a estrutura geral de um único registro é:

<span class="short-desc"><strong> DATE </strong> LIE <span class="short-truth"><a href=" URL "> EXPLANATION </a></span></span>

Observe que a data está incorporada na tag <strong> . Para selecioná-lo, podemos usar a função html_nodes() usando o seletor "strong" .

Em seguida, precisamos usar a função html_text() para extrair apenas o texto, com o argumento de corte ativo para cortar espaços avançados e à direita. Finalmente, fazemos uso do pacote stringr para adicionar o ano à data extraída.

Extraindo a mentira

Para selecionar a mentira, precisamos fazer uso da função xml_contents() que faz parte do pacote xml2 (este pacote é exigido pelo pacote rvest, portanto, não é necessário carregá-lo). A função retorna uma lista com os nós que fazem parte do first_result .

Estamos interessados ​​na mentira, que é o texto do segundo nó.

Observe que há um par extra de citações ("…") que envolvem a mentira. Para se livrar deles, simplesmente usamos a função str_sub() do pacote stringr para selecionar apenas a mentira.

Extraindo a explicação

Espero que até agora não seja muito complicado ver isso para extrair a explicação, simplesmente precisamos selecionar o texto dentro da tag <span> que pertence à class=".short-truth" . Isso extrairá o texto juntamente com os parênteses de abertura e de fechamento, mas podemos facilmente nos livrar deles.

Extraindo o URL

Finalmente, para obter o URL, observe que este é um atributo dentro da tag <a> . Nós simplesmente selecionamos esse nó com a função html_nodes() e, em seguida, selecione o atributo href com a função html_attr() .

Construindo o conjunto de dados

Encontramos uma maneira de extrair cada uma das 4 partes do primeiro registro. Podemos estender esse processo para o resto usando um loop for. No final, queremos ter um quadro de dados com 116 linhas (um para cada registro) e 4 colunas (para manter a data, a mentira, a explicação e a URL). Uma maneira de fazer isso é criar um quadro de dados vazio e simplesmente adicionar uma nova linha à medida que cada nova gravação é processada. No entanto, isso não é considerado uma boa prática. Como sugerido aqui , vamos criar um único quadro de dados para cada registro e armazená-los em uma lista. Uma vez que tenhamos os 116 quadros de dados, os bind_rows() usando a função bind_rows() do pacote dplyr . Isso cria o nosso conjunto de dados desejado.

Observe que a coluna para a data é considerada um vetor de caracteres. Seria bom tê-lo como um vetor de data e hora em vez disso. Para fazer isso, podemos usar o pacote lubridate e usar a função mdy() (mês-dia-ano) para fazer a conversão.

Exportando o conjunto de dados para um arquivo CSV

Se você quiser exportar seu conjunto de dados, você pode usar a função write.csv() que vem por padrão com R, ou a função write_csv() do pacote readr , que é duas vezes mais rápido e mais conveniente que o primeiro.

Da mesma forma, para recuperar seu conjunto de dados, você pode usar a função padrão read.csv() ou a função read_csv() do pacote readr .

Resumo

O código completo para este tutorial é mostrado abaixo:

Eu também quero mencionar que os pacotes stringr, dplyr, lubridate e readr fazem parte da família de limpeza . Esta é uma coleção de pacotes R que são projetados para trabalhar em conjunto para tornar o processo de análise de dados mais fácil. Na verdade, você também pode usar o popular pacote purrr para evitar o loop for. No entanto, isso exigiria a criação de uma função que mapeie cada registro para um quadro de dados. Para outro exemplo sobre como fazer raspagem na web, dê uma olhada nesta incrível postagem no blog de Dean Attali .

Espero que você ache este tutorial útil. Seu objetivo não é mostrar qual linguagem de programação é melhor, mas sim aprender com Python e R, além de aumentar suas habilidades e ferramentas de programação para enfrentar um conjunto mais diversificado de problemas.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *