Web scraping com ChatGPT: guia passo a passo

Aprenda a usar os recursos do ChatGPT para gerar scripts de web scraping para sites estáticos e complexos, simplificando seu processo de coleta de dados.
17 min read
Web Scraping With ChatGPT blog image

Com o contínuo crescimento exponencial da economia digital, coletar dados de várias fontes, como APIs, sites e bancos de dados, se tornou mais importante do que nunca.

Uma forma comum de extrair dados é por meio de web scraping. O web scraping envolve o uso de ferramentas automatizadas para buscar páginas web e analisar seu conteúdo para extrair informações específicas para posterior análise e uso. Casos de uso comuns incluem pesquisa de mercado, monitoramento de preços e agregação de dados.

A implementação do web scraping envolve lidar com conteúdo dinâmico, gerenciar sessões e cookies, contornar medidas antiscraping e garantir a conformidade legal. Esses desafios exigem ferramentas e técnicas avançadas para uma extração eficaz de dados. O ChatGPT pode ajudar com essas complexidades, aproveitando seus recursos de processamento de linguagem natural para gerar código e solucionar erros.

Neste artigo, você aprenderá a usar o ChatGPT para gerar código de extração de dados para sites baseados principalmente em conteúdo HTML estático e para sites complexos que empregam técnicas mais complexas de geração de páginas.

Pré-requisitos

Antes de começar este tutorial, certifique-se de ter o seguinte:

Quando você usa o ChatGPT para gerar seus scripts de web scraping, há duas etapas principais:

  1. Documente cada etapa que o código precisa seguir para encontrar as informações a serem extraídas, como quais elementos HTML devem ser visados, caixas de texto a serem preenchidas e botões a serem clicados. Muitas vezes, você precisará copiar o seletor do elemento HTML específico. Para fazer isso, clique com o botão direito do mouse no elemento específico da página que você deseja copiar e clique em Inspecionar. O Chrome destaca o elemento DOM específico. Clique com o botão direito do mouse e escolha Copiar > Copiar seletor para que o caminho do seletor HTML seja copiado para sua área de transferência:
    Copiando um seletor
  1. Crie prompts específicos e detalhados no ChatGPT para gerar o código de extração de dados.
  2. Execute e teste o código gerado.

Extraindo dados de sites com HTML estático usando o ChatGPT

Agora que você está familiarizado com o fluxo de trabalho geral, vamos usar o ChatGPT para extrair dados de alguns sites com elementos em HTML estático . Para começar, você extrairá os títulos e os preços dos livros em https://books.toscrape.com.

Inicialmente, você precisa identificar os elementos HTML que contêm os dados necessários:

  • seletor para o título do livro é #default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > h3 > a.
  • seletor para o preço do livro é *#default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.product_price > p.price_color.

Em seguida, você precisa criar prompts específicos e detalhados no ChatGPT para gerar o código de extração de dados. Para fazer isso, você precisa instruir o ChatGPT a instalar todos os pacotes Python necessários, orientá-lo na extração de seletores HTML (que você identificou anteriormente) e, em seguida, pedir que ele salve os dados como um arquivo do Excel.

Não se esqueça de definir a versão do ChatGPT como GPT-4o.

Você pode inserir algo assim no ChatGPT:

Você é um especialista em web scraping que utiliza a biblioteca Beautiful Soup do Python e todas as ferramentas de automação necessárias. Quero que você gere um script detalhado, passo a passo, para extrair dados de https://books.toscrape.com. Por favor, faça o seguinte:

  1. Instale todos os pacotes Python necessários.
  2. Extraia o título do livro, que tem o seletor HTML #default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > h3 > a, e o preço do livro (somente o número, nada mais), que tem o seletor #default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.product_price > p.price_color.
  3. Extraia a lista de todos os títulos e preços dos livros e armazene-a em um arquivo Excel.
  4. Extraia somente a primeira página.

Observe: você pode receber uma resposta ligeiramente diferente.

Na resposta, o ChatGPT instrui você a executar o seguinte comando para instalar a biblioteca Beautiful Soup, que faz o web scraping, e a pandas library, uma biblioteca abrangente de análise de dados que armazena dados como um arquivo do Excel:

pip3 install requests beautifulsoup4 pandas openpyxl

Você notará que o ChatGPT também sugere a instalação do openpyxl, mas isso não é necessário aqui.

O ChatGPT também fornece o seguinte código de web scraping:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# URL of the website
url = 'https://books.toscrape.com'

# Send a GET request to the website
response = requests.get(url)
if response.status_code == 200:
    # Parse the HTML content of the page
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # Initialize lists to store the titles and prices
    book_titles = []
    book_prices = []

    # Extract the first book title and price using the provided selectors
    book_title_selector = "#default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > h3 > a"
    book_price_selector = "#default > div.container-fluid.page > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.product_price > p.price_color"

    title_element = soup.select_one(book_title_selector)
    price_element = soup.select_one(book_price_selector)
    
    if title_element and price_element:
        book_titles.append(title_element.get('title'))
        book_prices.append(price_element.text.strip()[1:])

    # Extract all book titles and prices on the first page
    books = soup.select('section > div:nth-child(2) > ol > li')
    for book in books:
        title = book.select_one('h3 > a')
        price = book.select_one('div.product_price > p.price_color')
        if title and price:
            book_titles.append(title.get('title'))
            book_prices.append(price.text.strip()[1:])

    # Create a DataFrame from the lists
    df = pd.DataFrame({
        'Title': book_titles,
        'Price': book_prices
    })

    # Save the DataFrame to an Excel file
    df.to_excel('books_scraped.xlsx', index=False)

    print('Data has been successfully scraped and saved to books_scraped.xlsx')
else:
    print('Failed to retrieve the webpage')

Esse código importa o módulo requests , que realiza chamadas HTTP para o site do qual ele extrai dados. Ele também importa pacotes da pandas que armazenam dados extraídos em arquivos do Excel. O código define o URL base do site e os seletores HTML específicos que ele visa para buscar os dados solicitados.

Em seguida, o código chama o site e coloca seu conteúdo como um objeto BeautifulSoup chamado soup. O código pega os valores do título e do preço do livro como listas do objeto soup usando os seletores HTML. Por fim, o código cria um DataFrame pandas a partir da lista de títulos e preços dos livros e o salva como um arquivo do Excel.

Em seguida, você precisa salvar o código em um arquivo chamado books_scraping.py e executar o comando python3 books_scraping.py na linha de comando. Esse código gera um arquivo do Excel chamado books_scraped.xlsx no mesmo diretório de books_scraping.py:

O arquivo do Excel gerado chamado books_scraped.xlsx

Agora que você viu um exemplo passo a passo, vamos avançar neste tutorial e extrair dados de outro site simples: https://quotes.toscrape.com, que contém uma coleção de citações.

Novamente, vamos começar identificando a sequência de etapas.

Se você estiver usando o Chrome, encontre os seguintes seletores HTML:

  • body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span.text para extrair a citação
  • body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span:nth-child(2) > small para identificar o autor

Depois de identificar os seletores HTML que você deseja extrair, você pode redigir um prompt detalhado, como o seguinte, para gerar o código de extração:

Você é um especialista em web scraping que utiliza a biblioteca Beautiful Soup do Python e todas as ferramentas de automação necessárias. Quero que você gere um script detalhado, passo a passo, para extrair dados de https://quotes.toscrape.com. Por favor, faça o seguinte:

  1. Instale todos os pacotes Python necessários.
  2. Extraia a citação, que tem o seletor HTML body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span.text, e o nome do autor, que tem o seletor body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span:nth-child(2) > small.
  3. Extraia a lista de todas as citações e autores e armazene-a em um arquivo do Excel.
  4. Extraia somente a primeira página.

Depois de inserir essas informações, o ChatGPT deve fornecer o seguinte comando, que instala as bibliotecas Beautiful Soup, pandas e openpyxl:

pip3 install requests beautifulsoup4 pandas openpyxl

O ChatGPT também deve fornecer o seguinte código de web scraping:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# Step 1: Fetch the web page content
url = "https://quotes.toscrape.com"
response = requests.get(url)
html_content = response.text

# Step 2: Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')

# Step 3: Extract the specific quote and author
quote_selector = "body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span.text"
author_selector = "body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span:nth-child(2) > small"

specific_quote = soup.select_one(quote_selector).get_text()
specific_author = soup.select_one(author_selector).get_text()

print(f"Specific Quote: {specific_quote}")
print(f"Specific Author: {specific_author}")

# Step 4: Extract all quotes and authors
quotes = soup.find_all('div', class_='quote')

all_quotes = []
for quote in quotes:
  text = quote.find('span', class_='text').get_text()
  author = quote.find('small', class_='author').get_text()
  all_quotes.append({"quote": text, "author": author})

# Step 5: Save the quotes to an Excel file
df = pd.DataFrame(all_quotes)
df.to_excel('quotes.xlsx', index=False)

print("Quotes have been saved to quotes.xlsx")
soup = BeautifulSoup(html_content, 'html.parser')

# Step 3: Extract the specific quote and author
quote_selector = "body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span.text"
author_selector = "body > div.container > div:nth-child(2) > div.col-md-8 > div:nth-child(1) > span:nth-child(2) > small"

specific_quote = soup.select_one(quote_selector).get_text()
specific_author = soup.select_one(author_selector).get_text()

print(f"Specific Quote: {specific_quote}")
print(f"Specific Author: {specific_author}")

# Step 4: Extract all quotes and authors
quotes = soup.find_all('div', class_='quote')

all_quotes = []
for quote in quotes:
    text = quote.find('span', class_='text').get_text()
    author = quote.find('small', class_='author').get_text()
    all_quotes.append({"quote": text, "author": author})

# Step 5: Save the quotes to an Excel file
df = pd.DataFrame(all_quotes)
df.to_excel('quotes.xlsx', index=False)

print("Quotes have been saved to quotes.xlsx")

Salve esse código em um arquivo chamado quotes_scraping.py e execute o comando python3 books_scraping.py na linha de comando. Esse código gera um arquivo do Excel chamado quotes_scraped.xlsx no mesmo diretório de quotes_scraping.py. Abra o arquivo do Excel gerado e ele deverá ter a seguinte aparência:

Arquivo do Excel gerado com citações e autores

Extraindo dados de sites complexos

Extrair dados de sites complexos pode ser um desafio porque o conteúdo dinâmico geralmente é carregado via JavaScript, o que ferramentas como requests e BeautifulSoup não conseguem manipular. Esses sites podem exigir interações, como clicar em botões ou rolar a página para acessar todos os dados. Para enfrentar esse desafio, você pode usar o WebDriver, que renderiza páginas como um navegador e simula interações do usuário, garantindo que todo o conteúdo seja acessível da mesma forma que seria para um usuário comum.

Por exemplo, Yelp é um site de avaliação de empresas via crowdsourcing. O Yelp se baseia na geração dinâmica de páginas e precisa simular várias interações do usuário. Aqui, você usará o ChatGPT para gerar um código de extração que recupera uma lista de empresas em Estocolmo e suas avaliações.

Para extrair dados do Yelp, vamos começar documentando as etapas que você seguirá:

  1. Encontre o seletor da caixa de texto de localização que o script usará. Nesse caso, é #search_location. Digite “Estocolmo” na caixa de pesquisa de localização e encontre o seletor do botão de pesquisa. Nesse caso, é #header_find_form > div.y-css-1iy1dwt > button. Clique no botão de pesquisa para ver os resultados. Isso pode levar alguns segundos. Encontre um seletor que contenha o nome da empresa (ou seja, #main-content > ul > li:nth-child(3) > div.container_\_09f24_\_FeTO6.hoverable_\_09f24_\__UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(1) > div > div > h3 > a):
    Obtendo o seletor do nome da empresa
  1. Encontre o seletor que contém a avaliação da empresa (ou seja, #main-content > ul > li:nth-child(3) > div.container_\_09f24_\_FeTO6.hoverable_\_09f24_\__UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(2) > div > div > div > div.y-css-ohs7lg > span.y-css-jf9frv):
    Obtendo o seletor da média de avaliações da empresa
  1. Encontre o seletor do botão Aberto agora . É este aqui #main-content > div.stickyFilterOnSmallScreen_\_09f24_\_UWWJ3.hideFilterOnLargeScreen_\_09f24_\_ilqIP.y-css-9ze9ku > div > div > div > div > div > span > button:nth-child(3) > span:
    Seletor do botão Aberto agora
  1. Salve uma cópia da página web para que você possa carregá-la mais tarde, junto com o prompt do ChatGPT para ajudar o ChatGPT a entender o contexto dos prompts. No Chrome, você pode fazer isso clicando nos três pontos no canto superior direito e clicando em Salvar e compartilhar > Salvar página como:
    Salvar página web no Chrome

Em seguida, usando os valores do seletor que você extraiu anteriormente, você precisa redigir um prompt detalhado para orientar o ChatGPT na geração do script de extração:

Você é um especialista em web scraping. Quero que você faça o scraping de https://www.yelp.com/ para extrair informações específicas. Siga estas etapas antes de extrair dados:

  1. Limpe a caixa com o seletor #search_location.
  2. Digite “Estocolmo” na caixa de pesquisa com o seletor #search_location.
  3. Clique no botão com o seletor #header_find_form > div.y-css-1iy1dwt > button.
  4. Aguarde alguns segundos para que a página carregue os resultados da pesquisa.
  5. Clique no botão Aberto agora, que tem o seletor #main-content > div.stickyFilterOnSmallScreen_\_09f24_\_UWWJ3.hideFilterOnLargeScreen_\_09f24_\_ilqIP.y-css-9ze9ku > div > div > div > div > div > span > button:nth-child(3) > span, para filtrar as empresas que estão abertas agora.
  6. Crie uma lista com os nomes das empresas. O nome da empresa tem o seletor #main-content > ul > li:nth-child(3) > div.container_\_09f24_\_FeTO6.hoverable_\_09f24_\__UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(1) > div > div > h3 > a.
  7. Crie uma lista com as avaliações das empresas. As avaliações têm o seletor #main-content > ul > li:nth-child(3) > div.container_\_09f24_\_FeTO6.hoverable_\_09f24_\__UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(2) > div > div > div > div.y-css-ohs7lg > span.y-css-jf9frv.
  8. Crie um arquivo do Excel com os nomes das empresas e suas avaliações.
  9. Certifique-se de instalar todos os pacotes Python relevantes.
  10. Use o WebDriver da Selenium para automatizar o processo.
  11. Consulte a cópia anexa da página HTML de resultados para contextualizar o formato HTML.

Depois de inserir essas informações, o ChatGPT solicita que você instale o Selenium, a estrutura de automação web que suporta o WebDriver e a pandas:

pip3 install selenium pandas

O ChatGPT também fornece alguns códigos de scraping junto com uma explicação:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time

# Initialize the WebDriver
driver = webdriver.Chrome()

try:
    # Open Yelp
    driver.get('https://www.yelp.com/')

    # Clear the location search box
    location_box = driver.find_element(By.CSS_SELECTOR, '#search_location')
    location_box.clear()

    # Enter "Stockholm" in the location search box
    location_box.send_keys('Stockholm')

    # Click the search button
    search_button = driver.find_element(By.CSS_SELECTOR, '#header_find_form > div.y-css-1iy1dwt > button')
    search_button.click()

    # Wait for search results to load
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#main-content'))
    )

    # Click on "Open Now" filter
    open_now_button = driver.find_element(By.CSS_SELECTOR, '#main-content > div.stickyFilterOnSmallScreen__09f24__UWWJ3.hideFilterOnLargeScreen__09f24__ilqIP.y-css-9ze9ku > div > div > div > div > div > span > button:nth-child(3) > span')
    open_now_button.click()

    # Wait for the filter results to load
    time.sleep(5)

    # Extract business names and reviews
    business_names = []
    business_reviews = []

    businesses = driver.find_elements(By.CSS_SELECTOR, '#main-content > ul > li')

    for business in businesses:
        try:
            name = business.find_element(By.CSS_SELECTOR, 'div.container__09f24__FeTO6.hoverable__09f24___UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(1) > div > div > h3 > a').text
            review = business.find_element(By.CSS_SELECTOR, 'div.container__09f24__FeTO6.hoverable__09f24___UXLO.y-css-way87j > div > div.y-css-cxcdjj > div:nth-child(1) > div.y-css-1iy1dwt > div:nth-child(2) > div > div > div > div.y-css-ohs7lg > span.y-css-jf9frv').text
            business_names.append(name)
            business_reviews.append(review)
        except Exception as e:
            print(f"Error extracting data for a business: {e}")

    # Create a DataFrame and save to Excel
    df = pd.DataFrame({'Business Name': business_names, 'Reviews': business_reviews})
    df.to_excel('stockholm_businesses.xlsx', index=False)
    print("Data saved to stockholm_businesses.xlsx")

finally:
    # Close the WebDriver
    driver.quit()

Salve esse script e execute-o usando Python no Visual Studio Code. Você notará que o código inicia o Chrome, navega até o Yelp, limpa a caixa de texto de localização, insere “Estocolmo”, clica no botão de pesquisa, filtra as empresas que estão abertas agora e fecha a página. Depois disso, o resultado da extração de dados é salvo no arquivo do Excel stockholm_bussinsess.xlsx:

Avaliações de negócios do Yelp no Excel

Todo o código-fonte para esse tutorial está disponível no GitHub.

Conclusão

Neste tutorial, você aprendeu a usar o ChatGPT para extrair informações específicas de sites com renderização HTML estática e sites mais complexos com geração dinâmica de páginas, links externos de JavaScript e interações do usuário.

Embora a extração de dados de um site como o Yelp tenha sido simples, na realidade, a extração de estruturas HTML complexas na web pode ser um desafio, e você provavelmente enfrentará banimentos de IP e CAPTCHAs.

Para facilitar, a Bright Data oferece uma ampla variedade de serviços de coleta de dados, incluindo serviços de proxy avançados para ajudar a contornar banimentos de IP, Web Unlocker para contornar e resolver CAPTCHAs, APIs de Web Scraping para extração automatizada de dados e um Scraping Browser para extração eficiente de dados.

Registre-se agora e descubra todos os produtos que a Bright Data tem a oferecer. Comece com um teste grátis hoje!

Não é necessário cartão de crédito