Vamos dividir o nosso código em duas secções: uma para a extração de dados e outra para a manipulação de dados. A primeira parte é coberta pelo pacote Requests, enquanto a segunda parte é coberta pelo BeautifulSoup. Sem mais delongas, vamos começar a programar, começando pela parte da extração:
import requests
def scrape( url = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
response = requests.get( url )
return response
Nesta secção, estamos a definir uma função com apenas um parâmetro: o URL de destino. Se o URL não for fornecido, vamos imprimir uma mensagem e interromper a execução. Caso contrário, estamos a usar o método get do Requests para devolver a resposta. Agora, sabemos que os clientes HTTP do Python abrangem mais métodos, por isso vamos adicionar um parâmetro condicional:
import requests
def scrape( method = 'get', url = None, data = None ):
# if there is no URL, there is no need to use Python HTTP clients
# We will print a message and stop execution
if url == None:
print('[!] Please add a target!')
return
if method.lower() == 'get':
response = requests.get( url )
elif method.lower() == 'post':
if data == None:
print('[!] Please add a payload to your POST request!')
return
response = requests.post( url, data )
return response
Como pode ver, adicionámos mais alguns parâmetros à nossa função. O parâmetro `method` especifica qual o método que deve ser utilizado para o nosso pedido. O `data` representa a carga útil que estamos a enviar com o pedido POST. Por predefinição, o método é GET, pelo que o parâmetro `method` não é obrigatório.
Desafio: Adicione mais métodos a esta função e enriqueça as capacidades do nosso scraper. Não só é divertido, como também é uma boa abordagem de aprendizagem. Além disso, poderá personalizar o código para o adicionar ao seu portfólio.
Até agora, abordámos a extração de dados. Vamos analisar o HTML e fazer algo com ele:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el)
return elements
Mas um scraper da Web deve ser capaz de extrair dados mais específicos. Por exemplo, deve ser capaz de localizar e devolver elementos com base no seu seletor CSS. Vamos, então, adicionar a lógica que trata desta parte:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None, attr = None, attr_value = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el, { attr : attr_value })
return elements
O BeautifulSoup permite-nos extrair dados específicos com base nos seus atributos. Por isso, adicionámos aqui dois novos parâmetros que nos ajudarão a localizar e extrair elementos com base nos seus atributos.
Agora temos tudo o que precisamos. Resta apenas combinar as duas secções e teremos o nosso web scraper. Depois de montar o seu código, basta:
- Crie uma nova variável que irá armazenar os dados extraídos com o Requests
- Imprima os elementos devolvidos pelo BeautifulSoup
Aqui estão as duas peças que faltavam no seu código:
data = scrape('GET', 'https://webscrapingapi.com')
print( extract_elements(data, 'ul') )
Tenho a certeza de que já percebeu o que tudo faz e que não há necessidade de tradução nesta altura. Tal como com o nosso scraper, desafio-o a experimentar a função `extract_elements` e a fazer com que ela faça mais do que simplesmente devolver elementos.