Agora está tudo pronto para utilizar o PycURL e o BeautifulSoup. Para utilizar estes pacotes, precisamos primeiro de os importar para o nosso ficheiro `scraper.py`. Basta adicionar este trecho no topo do ficheiro:
import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup
# All our logic will go underneath this line
Agora que importou os pacotes, vamos lidar com a lógica do nosso web scraper. Pelo que discutimos até agora, sabemos que precisamos de abordar dois aspetos: extração de dados e tratamento de dados. A primeira secção é coberta pelo PycURL e a segunda secção é coberta pelo BeautifulSoup. Para uma melhor estrutura, sugiro que tratemos cada secção separadamente.
3.1. Extração de dados com cURL e Python
Quando digo «scraping», estou a referir-me à parte de extração do web scraper. Tendo isto em mente e sabendo como usar o curl em Python através da interação com a interface PycURL, vamos escrever o código:
# Setting global variables
TARGET_URL = 'https://httpbin.org/forms/post'
# Using cURL and Python to gather data from a server via PycURL
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, TARGET_URL)
curl.setopt(curl.WRITEDATA, buffer)
curl.setopt(curl.CAINFO, certifi.where())
curl.perform()
curl.close()
# Using BytesIO to retrieve the scraped data
body = buffer.getvalue()
# Saving the output and printing it in terminal
data = body.decode('iso-8859-1')
print(data)
No código acima, começamos por declarar a variável global `TARGET_URL`, que contém o URL do site do qual queremos extrair dados. Em seguida, criamos um buffer usando `BufferIO`, inicializamos o PycURL e definimos duas opções: uma para a transferência de dados e outra para o nome do ficheiro que contém os certificados. Por último, mas não menos importante, executamos a ação curl e, em seguida, encerramos a sessão.
É isso, utilizou com sucesso o Python para fazer um pedido cURL e imprimiu o ficheiro HTML na sua consola. Agora, tudo o que precisamos de fazer é tratar da segunda secção, nomeadamente o tratamento de dados.
3.2. Análise de HTML com Python e BeautifulSoup
Ter os dados brutos é redundante na extração de dados da web, a menos que realizemos algum tipo de ação sobre eles. Pois o objetivo mais básico de qualquer extrator de dados da web é extrair dados do HTML. Para o nosso exemplo, vamos supor que queremos extrair todo o texto dentro dos elementos `<p>` da variável `data` (que atualmente contém todo o HTML extraído). Eis como fazemos isso usando o BeautifulSoup:
# Parsing data using BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Finding elements using BeautifoulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
print(p.text)
Como pode ver, com o BeautifulSoup, bastam apenas 4 linhas de código para extrair o resultado desejado. A execução do script completo deverá agora apresentar o texto dentro de cada parágrafo encontrado no ficheiro HTML que recolhemos do nosso site de destino.
Assim, partindo do princípio de que seguiu as instruções e que o seu `scraper.py` inclui todo o código que escrevemos nesta secção, vamos voltar ao terminal e executar o script:
~/desktop/py_scraper » python3 scraper.py
Customer name:
Telephone:
E-mail address:
Small
Medium
Large
Bacon
Extra Cheese
Onion
Mushroom
Preferred delivery time:
Delivery instructions:
Submit order