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!