Categorias
Python

Web scraping com Python

Coletando dados de sites usando as bibliotecas Requests e Beautifulsoup

Web scraping, ou no português raspagem de dados da rede, corresponde ao uso de scripts para coletar automaticamente dados de websites. Python permite automatizar tarefas de coletas de dados usando a biblioteca requests. Podemos ainda manipular os dados coletados usando a biblioteca

Instalando as bibliotecas

 pip install requests
 pip install beautifulsoup4 

Coletando os dados de um site

Vamos usar as duas bibliotecas para coletar dados de um site. O escolhido será o site pudim.com.br.

O site pudim.com.br exibe apenas a foto de um pudim seguido de um endereço de e-mail.

Primeiro, vamos coletar os dados usando requests:

from bs4 import BeautifulSoup
import requests

# Site que será coletado
site = "http://www.pudim.com.br/"

# Coleta os dados do site
html = requests.get(site)
print(html.text)

Observe como o código HTML será impresso:

Código fonte do site pudim.com.br.

Agora vamos formatar esses dados usando BeautifulSoup:

from bs4 import BeautifulSoup
import requests

# Site que será coletado
site = "http://www.pudim.com.br/"

# Coleta os dados do site
html = requests.get(site).content

# Formatando os dados
dados = BeautifulSoup(html, 'html.parser')
print(dados.prettify())

Perceba que adicionamos o atributo content ao final da requisição. A seguir aplicamos esse valor como parâmetro de entrada para o método BeautifulSoup. Será impresso será o seguinte código:

Perceba que pouca coisa mudou se compararmos ao código anterior. Entretanto, note que BeautifulSoup indentou o código (por exemplo, note o espaço antes da tag <head>).

Perceba que se imprimirmos apenas a variável html, que armazena o atributo content do objeto obtido pela consulta ao site, teremos apenas uma string não formatada:

Entretanto, podemos fazer mais coisas usando BeautifulSoup.

Coletando elementos HTML específicos

Podemos coletar elementos específicos usando os métodos find(), retorna um único elemento, ou find_all(), retorna uma lista com todos os elementos que atendam aos requisitos da busca.

# Busca por tag HTML
busca_por_tag = dados.find("TAG_BUSCADA")

# Busca por id
busca_por_id = dados.find(id="ABC")

# Busca por class
busca_por_class = dados.find(class_="XYZ")

# Buscando todos os elementos
busca_tudo = dados.find_all("div")

Por exemplo, veja como coletamos o item com a classe email:

from bs4 import BeautifulSoup
import requests

# Site que será coletado
site = "http://www.pudim.com.br/"

# Coleta os dados do site
html = requests.get(site).content

# Formatando os dados
dados = BeautifulSoup(html, 'html.parser')

# Coletando a div que armazena o email
email = dados.find("div", class_="email")
print(email)

Será impresso o seguinte:

Podemos formatar melhor isso, usando o método prettify():

print(email.prettify())

Veja o resultado:

Coletando apenas os textos

Digamos que desejamos coletar apenas o texto presente dentro da tag <a>. Perceba que no exemplo anterior, o texto que desejamos está dentro da <div> de classe email e do elemento <a>, ou seja, queremos o texto pudim@pudim.com.br.

Veja como podemos coletar isso:

from bs4 import BeautifulSoup
import requests

# Site que será coletado
site = "http://www.pudim.com.br/"

# Coleta os dados do site
html = requests.get(site).content

# Formatando os dados
dados = BeautifulSoup(html, 'html.parser')


# coletando a class email
email = dados.find("div", class_="email")

# coletando a tag dentro da div email
link = email.find("a")
print("1", link)  

# coletando apenas o texto
print("2", link.text)

# coletando o endereço do link
print("3", link.attrs['href'])

Esse código irá imprimir:

Métodos e Atributos de um objeto BeautifulSoup

A lista a seguir apresenta uma série de atributos, iteradores e métodos que podem ser aplicados a um objeto BeautifulSoup.

Método/atributoDefinição
appendacrescentar
attrsatributos
can_be_empty_elementpode ser um elemento vazio
cdata_list_attributesAtributos da lista cdata
childGeneratorgerador infantil
childrencrianças
clearlimpar
contentsconteúdo
decodedecodificar
decode_contentsdecodificar o conteúdo
decomposedecompor
decomposeddecomposto
descendantsdescendentes
encodecodificar
encode_contentscodificar conteúdo
extendampliar
extractextrair
fetchNextSiblingsbuscar os próximos irmãos
fetchParentsbuscar pais
fetchPreviousbuscar anterior
fetchPreviousSiblingsbuscar irmãos anteriores
findachar
findAllencontrar tudo
findAllNextencontre tudo próximo
findAllPreviousencontrar todos os anteriores
findChildencontrar criança
findChildrenencontrar crianças
findNextencontre o próximo
findNextSiblingencontre o próximo irmão
findNextSiblingsencontrar próximos irmãos
findParentencontrar pai
findParentsencontrar pais
findPreviousencontrar anterior
findPreviousSiblingencontrar irmão anterior
findPreviousSiblingsencontrar irmãos anteriores
find_allencontrar tudo
find_all_nextencontre tudo próximo
find_all_previousencontrar todos os anteriores
find_nextencontre o próximo
find_next_siblingencontre o próximo irmão
find_next_siblingsencontrar próximos irmãos
find_parentencontrar pai
find_parentsencontrar pais
find_previousencontrar anterior
find_previous_siblingencontrar irmão anterior
find_previous_siblingsencontrar irmãos anteriores
format_stringstring de formato
formatter_for_nameformatador para nome
getobter
getTextobter texto
get_attribute_listobter lista de atributos
get_textobter texto
has_attrtem attr
has_keytem chave
hiddenescondido
indexíndice
insertinserir
insert_afterinserir depois
insert_beforeinsira antes
isSelfClosingé auto-fechando
is_empty_elementé um elemento vazio
known_xmlxml conhecido
namenome
namespacenamespace
nextNext
nextGeneratorpróximo gerador
nextSiblingpróximo irmão
nextSiblingGeneratorpróximo irmão gerador
next_elementpróximo elemento
next_elementspróximos elementos
next_siblingpróximo irmão
next_siblingspróximos irmãos
parentpai
parentGeneratorgerador pai
parentspais
parserClassclasse de analisador
parser_classclasse de analisador
prefixprefixo
preserve_whitespace_tagspreservar as tags de espaço em branco
prettifyembelezar
previousanterior
previousGeneratorgerador anterior
previousSiblingirmão anterior
previousSiblingGeneratorgerador irmão anterior
previous_elementelemento anterior
previous_elementselementos anteriores
previous_siblingirmão anterior
previous_siblingsirmãos anteriores
recursiveChildGeneratorgerador recursivo de filho
renderContentsrenderizar conteúdo
replaceWithsubstituir com
replaceWithChildrensubstitua por crianças
replace_withsubstituir com
replace_with_childrensubstitua por crianças
selectselecionar
select_oneselecione um
setupconfigurar
smoothsuave
sourcelinelinha de origem
sourceposposição da fonte
stringretorna uma string
stringsretorna as strings
stripped_stringscordas despojadas
textretorna apenas o texto
unwrapdesembrulhar
wrapembrulho

Por Diego Mariano

Doutor em Bioinformática pela Universidade Federal de Minas Gerais com atuação na área de ciência de dados e aprendizado de máquina aplicados ao aperfeiçoamento de enzimas usadas na produção de biocombustíveis. Mestre em Bioinformática, também pela UFMG, atuando na área de desenvolvimento de sistemas Web para montagem de genomas. Atualmente realiza estágio pós-doutoral no Departamento de Ciência da Computação da UFMG com foco em desenvolvimento de sistemas Web para Bioinformática, análise exploratória e visualização de dados. Tem conhecimentos nas linguagens: PHP, JavaScript, Python, R, Perl, HTML, CSS e SQL.

Deixe um comentário

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