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.
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:
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 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/atributo | Definição |
---|---|
append | acrescentar |
attrs | atributos |
can_be_empty_element | pode ser um elemento vazio |
cdata_list_attributes | Atributos da lista cdata |
childGenerator | gerador infantil |
children | crianças |
clear | limpar |
contents | conteúdo |
decode | decodificar |
decode_contents | decodificar o conteúdo |
decompose | decompor |
decomposed | decomposto |
descendants | descendentes |
encode | codificar |
encode_contents | codificar conteúdo |
extend | ampliar |
extract | extrair |
fetchNextSiblings | buscar os próximos irmãos |
fetchParents | buscar pais |
fetchPrevious | buscar anterior |
fetchPreviousSiblings | buscar irmãos anteriores |
find | achar |
findAll | encontrar tudo |
findAllNext | encontre tudo próximo |
findAllPrevious | encontrar todos os anteriores |
findChild | encontrar criança |
findChildren | encontrar crianças |
findNext | encontre o próximo |
findNextSibling | encontre o próximo irmão |
findNextSiblings | encontrar próximos irmãos |
findParent | encontrar pai |
findParents | encontrar pais |
findPrevious | encontrar anterior |
findPreviousSibling | encontrar irmão anterior |
findPreviousSiblings | encontrar irmãos anteriores |
find_all | encontrar tudo |
find_all_next | encontre tudo próximo |
find_all_previous | encontrar todos os anteriores |
find_next | encontre o próximo |
find_next_sibling | encontre o próximo irmão |
find_next_siblings | encontrar próximos irmãos |
find_parent | encontrar pai |
find_parents | encontrar pais |
find_previous | encontrar anterior |
find_previous_sibling | encontrar irmão anterior |
find_previous_siblings | encontrar irmãos anteriores |
format_string | string de formato |
formatter_for_name | formatador para nome |
get | obter |
getText | obter texto |
get_attribute_list | obter lista de atributos |
get_text | obter texto |
has_attr | tem attr |
has_key | tem chave |
hidden | escondido |
index | índice |
insert | inserir |
insert_after | inserir depois |
insert_before | insira antes |
isSelfClosing | é auto-fechando |
is_empty_element | é um elemento vazio |
known_xml | xml conhecido |
name | nome |
namespace | namespace |
next | Next |
nextGenerator | próximo gerador |
nextSibling | próximo irmão |
nextSiblingGenerator | próximo irmão gerador |
next_element | próximo elemento |
next_elements | próximos elementos |
next_sibling | próximo irmão |
next_siblings | próximos irmãos |
parent | pai |
parentGenerator | gerador pai |
parents | pais |
parserClass | classe de analisador |
parser_class | classe de analisador |
prefix | prefixo |
preserve_whitespace_tags | preservar as tags de espaço em branco |
prettify | embelezar |
previous | anterior |
previousGenerator | gerador anterior |
previousSibling | irmão anterior |
previousSiblingGenerator | gerador irmão anterior |
previous_element | elemento anterior |
previous_elements | elementos anteriores |
previous_sibling | irmão anterior |
previous_siblings | irmãos anteriores |
recursiveChildGenerator | gerador recursivo de filho |
renderContents | renderizar conteúdo |
replaceWith | substituir com |
replaceWithChildren | substitua por crianças |
replace_with | substituir com |
replace_with_children | substitua por crianças |
select | selecionar |
select_one | selecione um |
setup | configurar |
smooth | suave |
sourceline | linha de origem |
sourcepos | posição da fonte |
string | retorna uma string |
strings | retorna as strings |
stripped_strings | cordas despojadas |
text | retorna apenas o texto |
unwrap | desembrulhar |
wrap | embrulho |
2 respostas em “Web scraping com Python”
Olá, parabéns! Vi diversos vídeos sobre web scraping, mas o seu artigo foi o melhor de todos. Eu to começando agora, mas entendi muito bem. Pena que não consegui o que queria. Queria pegar o dolar do dia, mas só volta resultado vazio. Se quiser me ajudar agradeço. mas vou continuar a procura do conhecimento. sou de JF, MG. Obg.
Otimo conteudo!