Raspe um site com este lindo tutorial de sopa de python
Beautiful Soup é uma biblioteca Python de código aberto. Ele usa analisadores de navegação para raspar o conteúdo de arquivos XML e HTML. Você precisa de dados para vários fins analíticos. No entanto, se você é novo em Python e web scraping, vale a pena experimentar a biblioteca Beautiful Soup do Python para um projeto de web scraping.
Com a biblioteca Beautiful Soup de código aberto do Python, você pode obter dados copiando qualquer parte ou elemento de uma página da Web com o máximo controle sobre o processo. Neste artigo, veremos como você pode usar o Beautiful Soup para raspar um site.
Como instalar uma sopa bonita e começar a usá-la
Antes de prosseguirmos, neste artigo do tutorial da Beautiful Soup, usaremos Python 3 e beautifulsoup4 , a versão mais recente da Beautiful Soup. Certifique-se de criar um ambiente virtual Python para isolar seu projeto e seus pacotes daqueles em sua máquina local.
Para começar, você deve instalar a biblioteca Beautiful Soup em seu ambiente virtual. Beautiful Soup está disponível como um pacote PyPi para todos os sistemas operacionais, portanto, você pode instalá-lo com o comando pip install beautifulsoup4 por meio do terminal.
No entanto, se você estiver no Debian ou Linux, o comando acima ainda funciona, mas você pode instalá-lo com o gerenciador de pacotes executando apt-get install python3-bs4 .
Beautiful Soup não raspa URLs diretamente. Ele só funciona com arquivos HTML ou XML prontos. Isso significa que você não pode passar um URL diretamente para ele. Para resolver esse problema, você precisa obter a URL do site de destino com a biblioteca de solicitações do Python antes de alimentá-la com a Beautiful Soup.
Para disponibilizar essa biblioteca para seu raspador, execute o comando pip install requests por meio do terminal.
Para usar a biblioteca do analisador XML, execute pip install lxml para instalá-la.
Inspecione a página da web que você deseja raspar
Antes de limpar qualquer site com o qual você não está familiarizado, uma prática recomendada é inspecionar seus elementos. Você pode fazer isso alternando seu navegador para o modo de desenvolvedor. É muito fácil usar o Chrome DevTools se você estiver usando o Google Chrome.
No entanto, é necessário inspecionar uma página da web para saber mais sobre suas tags, atributos, classes e ids HTML. Isso expõe os principais elementos de uma página da web e seus tipos de conteúdo.
Também ajuda a desenvolver as melhores estratégias que você pode usar para obter os dados exatos que deseja de um site e como obtê-los.
Como raspar os dados de um site com uma sopa bonita
Agora que você tem tudo pronto e pronto, abra um editor de código de sua preferência e crie um novo arquivo Python, dando a ele um nome escolhido. No entanto, você também pode usar IDEs baseados na web, como o Jupyter Notebook, se não estiver familiarizado com a execução do Python por meio da linha de comando.
Em seguida, importe as bibliotecas necessárias:
from bs4 import BeautifulSoup
import requests
Primeiro, vamos ver como funciona a biblioteca de solicitações:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
print(website)
Quando você executa o código acima, ele retorna um status 200, indicando que sua solicitação foi bem-sucedida. Caso contrário, você obterá um status 400 ou alguns outros status de erro que indicam uma falha na solicitação GET.
Lembre-se de sempre substituir o URL do site entre parênteses pelo seu URL de destino.
Depois de obter o site com a solicitação get , você o passa para a Beautiful Soup, que agora pode ler o conteúdo como arquivos HTML ou XML usando seu XML ou analisador HTML integrado, dependendo do formato escolhido.
Dê uma olhada neste próximo snippet de código para ver como fazer isso com o analisador HTML:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup)
O código acima retorna todo o DOM de uma página da web com seu conteúdo.
Você também pode obter uma versão mais alinhada do DOM usando o método prettify . Você pode tentar isso para ver o resultado:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.prettify())
Você também pode obter o conteúdo puro de uma página da web sem carregar seu elemento com o método .text :
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.text)
Como raspar o conteúdo de uma página da web pelo nome da tag
Você também pode raspar o conteúdo em uma tag específica com Beautiful Soup. Para fazer isso, você precisa incluir o nome da tag de destino em sua solicitação de raspador de sopa bonita.
Por exemplo, vamos ver como você pode obter o conteúdo nas tags h2 de uma página da web.
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
print(soup.h2)
No snippet de código acima, soup.h2 retorna o primeiro elemento h2 da página da web e ignora o resto. Para carregar todos os elementos h2 , você pode usar a função integrada find_all e o loop for do Python:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups)
Esse bloco de código retorna todos os elementos h2 e seu conteúdo. No entanto, você pode obter o conteúdo sem carregar a tag usando o método .string :
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
h2tags = soup.find_all('h2')
for soups in h2tags:
print(soups.string)
Você pode usar este método para qualquer tag HTML. Tudo o que você precisa fazer é substituir a tag h2 pela que você gosta.
No entanto, você também pode raspar mais tags passando uma lista de tags para o método find_all . Por exemplo, o bloco de código abaixo raspa o conteúdo de a , h2 e tags de título :
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
tags = soup.find_all(['a', 'h2', 'title'])
for soups in tags:
print(soups.string)
Como raspar uma página da web usando o ID e o nome da classe
Depois de inspecionar um site com as DevTools, ele permite que você saiba mais sobre os atributos de id e classe que mantêm cada elemento em seu DOM. Assim que tiver essa informação, você pode raspar a página da web usando este método. É útil quando o conteúdo de um componente de destino está saindo do banco de dados.
Você pode usar o método find para os scrapers de id e classe. Ao contrário do método find_all que retorna um objeto iterável, o método find funciona em um único destino não iterável, que é o id neste caso. Portanto, você não precisa usar o loop for com ele.
Vejamos um exemplo de como você pode raspar o conteúdo de uma página abaixo usando o id:
from bs4 import BeautifulSoup
import requests
website = requests.get('http://somewebpages.com/')
soup = BeautifulSoup(website.content, 'html.parser')
id = soup.find(id = 'enter the target id here')
print(id.text)
Para fazer isso para um nome de classe, substitua o id por class . No entanto, escrever classe resulta diretamente em confusão de sintaxe, pois o Python a vê como uma palavra-chave. Para contornar esse erro, você precisa escrever um sublinhado na frente da classe como este: class_ .
Em essência, a linha que contém o id se torna:
my_classes = soup.find(class_ = 'enter the target class name here')
print(my_classes.text)
No entanto, você também pode raspar uma página da web chamando um nome de tag específico com seu ID ou classe correspondente:
data = soup.find_all('div', class_ = 'enter the target class name here')
print(data)
Como fazer um raspador reutilizável com uma bela sopa
Você pode criar uma classe e colocar todo o código anterior junto em uma função nessa classe para fazer um raspador reutilizável que obtém o conteúdo de algumas tags e seus ids. Podemos fazer isso criando uma função que aceita cinco argumentos: um URL, dois nomes de tag e seus IDs ou classes correspondentes.
Suponha que você queira raspar o preço das camisas de um site de comércio eletrônico. O exemplo de classe de raspador abaixo extrai as tags de preço e camisa com seus IDs ou classes correspondentes e, em seguida, retorna como um quadro de dados Pandas com 'Preço' e Shirt_name como os nomes das colunas.
Certifique-se de instalar o pandas através do terminal, caso ainda não tenha feito isso.
import pandas as pd
class scrapeit:
try:
def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):
if not (website and tag1 and id1 and tag2 and id2)==None:
try:
page = requests.get(website)
soup = BeautifulSoup(page.content, 'html.parser')
infotag1 = soup.find_all(tag1, id1)
infotag2 = soup.find_all(tag2, id2)
priced = [prices.text for prices in infotag1]
shirt = [shirts.text for shirts in infotag2]
data = {
'Price':priced,
'Shirt_name':shirt}
info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])
print(info)
except:
print('Not successful')
else:
print('Oops! Please enter a website, two tags and thier corresponding ids')
except:
print('Not successful!')
O raspador que você acabou de fazer é um módulo reutilizável e você pode importá-lo e usá-lo em outro arquivo Python. Para chamar a função scrape de sua classe, você usa scrapeit.scrape ('URL do site', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id') . Se você não fornecer o URL e outros parâmetros, a instrução else solicitará que você o faça.
Para usar esse scaper em outro arquivo Python, você pode importá-lo assim:
from scraper_module import scrapeit
scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')
Nota: scraper_module é o nome do arquivo Python que contém a classe scraper.
Você também pode verificar a documentação da Beautiful Soup se quiser se aprofundar em como fazer o melhor uso dela.
A bela sopa é uma ferramenta valiosa de raspagem da web
Beautiful Soup é um poderoso raspador de tela em Python que oferece controle sobre como os dados chegam durante a coleta. É uma ferramenta de negócios valiosa, pois pode fornecer acesso aos dados da web do concorrente, como preços, tendências de mercado e muito mais.
Embora tenhamos feito um raspador de tag neste artigo, você ainda pode brincar com esta poderosa biblioteca Python para fazer ferramentas de raspagem mais úteis.