Existem basicamente duas maneiras de extrair dados de um site:

  • Use a API do site (se houver). Por exemplo, o Facebook tem o Facebook Graph API que permite a recuperação de dados postados no Facebook.
  • Acesse o HTML da página da web e extraia informações / dados úteis dela. Essa técnica é chamada de web scraping ou web harvesting ou extração de dados web.

Este artigo discute as etapas envolvidas em web scraping usando a implementação de uma estrutura de Web Scraping em Python chamada Beautiful Soup.

Etapas envolvidas na web scraping:

  1. Envie uma solicitação HTTP para o URL da página da web que você deseja acessar. O servidor responde à solicitação retornando o conteúdo HTML da página da web. Para esta tarefa, usaremos uma biblioteca HTTP de terceiros para solicitações python.
  2. Depois de acessar o conteúdo HTML, somos deixados com a tarefa de analisar os dados. Como a maioria dos dados HTML está aninhada, não podemos extrair dados simplesmente por meio do processamento de strings. É necessário um analisador que pode criar uma estrutura aninhada / em árvore dos dados HTML. Existem muitas bibliotecas de analisador HTML disponíveis, mas a mais avançada é a html5lib.
  3. Agora, tudo o que precisamos fazer é navegar e pesquisar a árvore de análise que criamos, ou seja, a travessia da árvore. Para esta tarefa, usaremos outra biblioteca python de terceiros, Beautiful Soup . É uma biblioteca Python para extrair dados de arquivos HTML e XML.

Etapa 1: instalar as bibliotecas de terceiros necessárias

  • A maneira mais fácil de instalar bibliotecas externas em python é usar pip. pip é um sistema de gerenciamento de pacotes usado para instalar e gerenciar pacotes de software escritos em Python.
    Tudo que você precisa fazer é:
pedidos de instalação pip
pip install html5lib
pip install bs4

Etapa 2: Acessando o conteúdo HTML da página da web



import requests 
URL = "https://www.geeksforgeeks.org/data-structures/"
r = requests.get(URL) 
print(r.content) 

Vamos tentar entender esse pedaço de código.

  • Em primeiro lugar, importe a biblioteca de solicitações.
  • Em seguida, especifique o URL da página da web que você deseja copiar.
  • Envie uma solicitação HTTP para o URL especificado e salve a resposta do servidor em um objeto de resposta chamado r.
  • Agora, imprima r.content para obter o conteúdo HTML bruto da página da web. É do tipo 'string'.

Etapa 3: analisar o conteúdo HTML

import requests 
from bs4 import BeautifulSoup 
  
URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL) 
  
soup = BeautifulSoup(r.content, 'html5lib') 
print(soup.prettify()) 

Uma coisa realmente legal sobre a biblioteca BeautifulSoup é que ela é construída no topo das bibliotecas de análise de HTML como html5lib, lxml, html.parser, etc. Portanto, o objeto BeautifulSoup e a especificação da biblioteca de análise podem ser criados ao mesmo tempo.

No exemplo acima,

sopa = BeautifulSoup (r.content, 'html5lib')

Criamos um objeto BeautifulSoup passando dois argumentos:

  • r.content : é o conteúdo HTML bruto.
  • html5lib  : Especificando o analisador HTML que queremos usar.

Agora, o soup.prettify() é impresso,  ele dá a representação visual da árvore de análise criada a partir do conteúdo HTML bruto.

Etapa 4: pesquisar e navegar pela árvore de análise

Agora, gostaríamos de extrair alguns dados úteis do conteúdo HTML. O objeto sopa contém todos os dados na estrutura aninhada que podem ser extraídos programaticamente. Em nosso exemplo, estamos copiando uma página da web que consiste em algumas citações. Portanto, gostaríamos de criar um programa para salvar essas citações (e todas as informações relevantes sobre elas).



import requests 
from bs4 import BeautifulSoup 
import csv 
   
URL = "http://www.values.com/inspirational-quotes"
r = requests.get(URL) 
   
soup = BeautifulSoup(r.content, 'html5lib') 
   
quotes=[]  
   
table = soup.find('div', attrs = {'id':'all_quotes'})  
   
for row in table.findAll('div', 
                         attrs = {'class':'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): 
    quote = {} 
    quote['theme'] = row.h5.text 
    quote['url'] = row.a['href'] 
    quote['img'] = row.img['src'] 
    quote['lines'] = row.img['alt'].split(" #")[0] 
    quote['author'] = row.img['alt'].split(" #")[1] 
    quotes.append(quote) 
   
filename = 'inspirational_quotes.csv'
with open(filename, 'w', newline='') as f: 
    w = csv.DictWriter(f,['theme','url','img','lines','author']) 
    w.writeheader() 
    for quote in quotes: 
        w.writerow(quote) 

Antes de prosseguir, recomendamos que você percorra o conteúdo HTML da página da web que imprimimos usando o método soup.prettify() e tente encontrar um padrão ou uma maneira de navegar até as aspas.

  • Percebe-se que todas as aspas estão dentro de um contêiner div cujo id é 'all_quotes'. Então, encontramos esse elemento div (denominado como tabela no código acima) usando o método find() :
    table = soup.find ('div', attrs = {'id': 'all_quotes'}) 

    O primeiro argumento é a marca HTML que você deseja pesquisar e o segundo argumento é um elemento do tipo de dicionário para especificar os atributos adicionais associados a essa marca. O método find() retorna o primeiro elemento correspondente. Você pode tentar imprimir table.prettify() para ter uma ideia do que esse trecho de código faz.

  • Agora, no elemento table, pode-se notar que cada citação está dentro de um contêiner div cuja classe é citação. Portanto, iteramos por meio de cada contêiner div cuja classe é quote.
    Aqui, usamos o método findAll(), que é semelhante ao método find em termos de argumentos, mas retorna uma lista de todos os elementos correspondentes. Cada citação agora é iterada usando uma variável chamada linha.
    Aqui está um exemplo de conteúdo HTML de linha para melhor compreensão:
    Implementando Web Scraping em Python com Beautiful Soup
    Agora, considere este trecho de código:
    para linha em table.find_all_next ('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}):
        citação = {}
        citação ['tema'] = row.h5.text
        citação ['url'] = row.a ['href']
        citação ['img'] = row.img ['src']
        citação ['linhas'] = row.img ['alt']. split ("#") [0]
        citação ['autor'] = row.img ['alt']. split ("#") [1]
        quotes.append (quote)

    Criamos um dicionário para salvar todas as informações sobre uma cotação. A estrutura aninhada pode ser acessada usando a notação de ponto. Para acessar o texto dentro de um elemento HTML, usamos .text:

    citação ['tema'] = row.h5.text

    Podemos adicionar, remover, modificar e acessar os atributos de uma tag. Isso é feito tratando a tag como um dicionário:

    citação ['url'] = row.a ['href']

    Por fim, todas as aspas são anexadas à lista chamada aspas.

  • Finalmente, gostaríamos de salvar todos os nossos dados em algum arquivo CSV.
    filename = 'inspirational_quotes.csv'
    com aberto (nome do arquivo, 'w', nova linha = '') como f:
        w = csv.DictWriter (f, ['tema', 'url', 'img', 'linhas', 'autor'])
        w.writeheader()
        para citação entre aspas:
            w.writerow (citação)

    Aqui, criamos um arquivo CSV denominado inspirational_quotes.csv e salvamos todas as citações nele para uso posterior.

Portanto, este foi um exemplo simples de como criar um web scraper em Python. A partir daqui, você pode tentar descartar qualquer outro site de sua escolha. Em caso de dúvidas, poste abaixo na seção de comentários.

Nota: Web Scraping é considerado ilegal em muitos casos. Isso também pode fazer com que seu IP seja bloqueado permanentemente por um site.

Este blog é uma contribuição de Nikhil Kumar . Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou enviar o seu artigo para contribute@geeksforgeeks.org. Veja o seu artigo que aparece na página principal do GeeksforGeeks e ajude outros Geeks.

Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.

geeks-digest-img