Voltar ao blogue
Guias
Raluca PenciucLast updated on Apr 28, 202616 min read

Web Scraping com Python: O Guia Definitivo para Construir seu Scraper

Web Scraping com Python: O Guia Definitivo para Construir seu Scraper

Se no século XX lidávamos com a mentalidade de que «tempo é dinheiro», agora tudo gira em torno dos dados. Mais dados significam mais informações, e assim melhores decisões e mais dinheiro.

O web scraping e os web scrapers ganharam enorme popularidade, especialmente na última década. Cada vez mais empresas precisam de uma estratégia de marketing precisa, o que implica obter grandes quantidades de informação num curto espaço de tempo.

Com os holofotes agora voltados para a extração de dados, as empresas estão a começar a ver formas de se beneficiarem. Para os programadores, pode ser uma boa maneira de impulsionar os seus negócios ou apenas um projeto interessante para aperfeiçoar as suas competências de programação.

Mesmo que o seu trabalho não tenha nada a ver com web scraping, mas seja um colaborador de uma equipa de Python, no final deste artigo irá conhecer um novo nicho onde poderá tirar grande partido das suas competências. Veremos como podemos criar o nosso próprio Web Scraping com Python.

Compreender o Web Scraping com Python

Mas, primeiro, o que significa web scraping? No nível mais básico, um web scraper extrai os dados de um site, uma vez que nem todos disponibilizam os seus dados através de uma API pública.

Este processo é mais útil do que parece, se considerarmos que quanto mais informação tivermos, melhores decisões tomaremos no nosso negócio.

Hoje em dia, os sites estão cada vez mais repletos de conteúdo, pelo que realizar este processo inteiramente à mão está longe de ser uma boa ideia. É aí que entra em discussão a criação de uma ferramenta automatizada para web scraping.

«Para que preciso dos dados?», poderá perguntar. Bem, vamos dar uma vista de olhos a alguns dos principais casos de utilização em que o web scraping é uma salvação:

  • Inteligência de preços: uma empresa de comércio eletrónico precisará de informações sobre os preços dos concorrentes para tomar melhores decisões de preços e marketing.
  • Estudo de mercado: a análise de mercado implica informação de alta qualidade, em grande volume e perspicaz.
  • Imobiliário: particulares ou empresas precisam de agregar ofertas de várias fontes.
  • Geração de leads: encontrar clientes para o seu negócio em crescimento.
  • Monitorização da marca: as empresas analisam fóruns, plataformas de redes sociais e avaliações para acompanhar a forma como a sua marca é percebida.
  • A monitorização do preço mínimo anunciado (MAP) garante que os preços online de uma marca correspondem à sua política de preços.
  • Aprendizagem automática: os programadores precisam de fornecer dados de treino para que as suas soluções baseadas em IA funcionem corretamente.

Pode encontrar mais casos de utilização e uma descrição mais detalhada dos mesmos aqui.

«Ótimo, vamos começar!», poderá dizer. Não tão depressa.

Mesmo que perceba como funciona o web scraping e como pode melhorar o seu negócio, não é assim tão fácil criar um web scraper. Para começar, algumas pessoas não querem um scraper nos seus sites por diferentes razões.

Uma delas seria o facto de o scraping implicar o envio de muitos pedidos por segundo, o que pode sobrecarregar o servidor. Os proprietários de sites podem, por vezes, considerar isto como um ataque de hackers (negação de serviço), pelo que os sites adotam medidas para se protegerem, bloqueando os bots.

Algumas dessas medidas podem ser:

  • Bloqueio de IP: isto acontece quando um site deteta um número elevado de pedidos a partir do mesmo endereço IP; o site pode proibir-lhe totalmente o acesso ou tornar a sua navegação significativamente mais lenta.
  • CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart): são problemas lógicos bastante triviais de resolver para as pessoas, mas uma dor de cabeça para os scrappers.
  • Honeypot: links integrados invisíveis para humanos, mas visíveis para bots; assim que caem na armadilha, o site bloqueia o seu IP.
  • Login necessário: os sites podem esconder algumas informações de que precisa atrás de uma página de login; mesmo que se autentique no site, o scraper não tem acesso às suas credenciais ou cookies do navegador.

Alguns sites podem não implementar estas técnicas, mas o simples facto de quererem uma melhor experiência do utilizador através do Javascript torna a vida de um web scraper mais difícil.

Quando um site usa Javascript ou uma estrutura de geração de HTML, parte do conteúdo só fica acessível após algumas interações com o site ou após a execução de um script (geralmente escrito em Javascript) que gera o documento HTML.

Consideremos também a qualidade dos dados extraídos. Por exemplo, num site de comércio eletrónico, poderá ver preços diferentes de acordo com a região onde vive. Estes dados não são muito precisos, pelo que o bot deve encontrar uma forma de extrair os dados com a maior precisão possível.

Se conseguir superar tudo isto, ainda precisa de ter em conta que a estrutura do site pode sofrer alterações a qualquer momento. Afinal, um site precisa de ser intuitivo para o utilizador, não para o bot, pelo que a nossa ferramenta automatizada deve adaptar-se a essas alterações.

Nesta guerra interminável de scraping, os bots criam soluções por conta própria. O objetivo de todas elas é recriar o comportamento humano na Internet da melhor forma possível.

Por exemplo, pode evitar o bloqueio de IP utilizando serviços de proxy de IP. É melhor utilizar serviços pagos, porque os gratuitos tornam os seus IPs públicos, pelo que um site pode bloqueá-los.

Também pode integrar solucionadores de CAPTCHA. Estes irão ajudá-lo a obter feeds de dados contínuos, mas irão tornar o processo de scraping ligeiramente mais lento.

Como solução para as armadilhas honeypot, pode utilizar o XPath (ou mesmo expressões regulares, se for ousado o suficiente) para extrair itens específicos em vez de todo o documento HTML.

Considerar todas estas questões e como superá-las pode tornar-se um processo árduo e demorado. É por isso que, na última década, as APIs de web scraping ganharam cada vez mais atenção.

Aqui, na WebScrapingAPI, recolhemos o conteúdo HTML de qualquer site, gerindo qualquer desafio possível (como os mencionados anteriormente). Além disso, utilizamos a Amazon Web Services, pelo que a velocidade e a escalabilidade não são um problema. Está tentado a experimentar? Pode começar com uma conta gratuita, que lhe oferece 1000 chamadas de API por mês. Fantástico, não é?

Compreender a Web

Mas agora, voltemos ao objetivo deste artigo. Queremos aprender a construir um web scraper usando Python.

O primeiro conceito que é preciso conhecer é o Protocolo de Transferência de Hipertexto (HTTP), que explica a comunicação entre um servidor e um cliente. A ideia por trás disso é bastante simples. O cliente (aplicação) envia uma mensagem (pedido HTTP) ao servidor, e o servidor devolve uma resposta.

A mensagem contém várias informações que descrevem o cliente e como este irá processar os dados: método, versão HTTP e cabeçalhos.

No web scraping, o método mais utilizado para uma solicitação HTTP é o GET. Isso significa que irá recuperar os dados que solicitou. Se quiser saber mais sobre eles, pode encontrar aqui uma lista completa e detalhada.

Os cabeçalhos incluem informações adicionais sobre a solicitação ou resposta HTTP. Falaremos sobre os mais relevantes no web scraping, mas pode consultar a lista completa.

  • User-Agent: utilizado para identificar a aplicação, o sistema operativo, o software e a sua versão; um web scraper utiliza este cabeçalho para tornar as solicitações mais realistas.
  • Cookie: contém informações de estado sobre a solicitação (por exemplo, o token de autenticação).
  • Host: especifica o nome de domínio do servidor e, eventualmente, o número da porta na qual o servidor está a escutar.
  • Referrer: contém o site de origem de onde o utilizador veio; de acordo com isso, o conteúdo exibido pode ser diferente, pelo que um web scraper tem de ter isso em conta também.
  • Accept: informa ao servidor que tipo de conteúdo pode ser devolvido em resposta; é frequentemente ignorado na extração de dados da web, embora possa proporcionar uma comunicação mais orgânica entre o cliente e o servidor.

Compreender o Python

Python é uma linguagem de programação de alto nível e de uso geral que consegue manter-se nas preferências dos programadores por várias razões:

  • Código legível: a sua sintaxe simples torna-o a escolha perfeita para principiantes.
  • Paradigmas de programação: programação orientada a objetos, estruturada, funcional e orientada a aspetos são apenas alguns exemplos.
  • Biblioteca padrão robusta: vasta gama de módulos para todas as necessidades
  • Comunidade ativa: muitas bibliotecas e ferramentas de código aberto

Bem, dito isto, vamos preparar o nosso espaço de trabalho. Em primeiro lugar, precisamos do Python 3. Pode descarregá-lo e instalá-lo a partir daqui.

Este tutorial é independente de IDE, por isso sinta-se à vontade para escolher aquele com o qual se sentir mais confortável. Nós preferimos o Visual Studio Code porque é leve e está disponível para várias linguagens.

Também vamos usar várias bibliotecas Python:

  • requests: para fazer uma solicitação HTTP
  • beautifulsoup: para analisar o documento HTML
  • selenium: para extrair conteúdo dinâmico
  • nltk (opcional): para processar linguagem natural

Não é necessário instalá-las todas antecipadamente, pois há mais detalhes e instruções de instalação em cada etapa.

Agora, vamos começar a extrair dados da Web!

Criar o seu próprio scraper da Web

Para facilitar as coisas, o tutorial será dividido em etapas. Além disso, verá algumas etapas bónus marcadas com .1 após o número. Estas funcionam como alternativas que podem ser do seu interesse.

Passo 1: Inspecione a página que pretende extrair

Muito bem, chega de conversa, vamos ao que interessa.

Primeiro, precisamos de escolher um site que queremos rastrear. Para ilustrar os princípios, vamos escolher um site educativo simples: https://en.wikipedia.org/wiki/Beer.

Nesta etapa, queremos apenas verificar o documento HTML da página para ter uma ideia geral da sua estrutura. Não importa qual o navegador ou sistema operativo que utilize nesta etapa; o processo é o mesmo. Clique com o botão direito em qualquer lugar, sobre uma imagem, um link ou um simples bloco de texto, e depois escolha a opção “Inspecionar elemento”.

O separador «Elementos» é a única coisa em que nos vamos concentrar. Dependendo do site, poderá ver muito código HTML. É importante não se deixar intimidar por isso, mas verificar apenas os dados que lhe interessam.

Passo 2: Enviar um pedido HTTP

Agora podemos começar a escrever o código para o nosso web scraper. Começamos simplesmente por fazer uma solicitação HTTP ao nosso site para que este devolva o código HTML completo que acabámos de ver no navegador. Como é que isso ficaria no código? Bem, fantástico! Afinal, estamos a falar de Python.

Vamos instalar a biblioteca requests para fazer a solicitação HTTP:

pip install requests

Agora vamos escrever o código:

import requests
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)

Bastante simples, certo? Importámos a biblioteca que instalámos anteriormente. Em seguida, definimos o URL do site que queremos extrair e fizemos uma solicitação GET. Se quiser ver qual é o resultado, vá em frente e imprima-o. Por enquanto, verá apenas uma sequência de caracteres confusa que deve representar o HTML que viu no seu navegador. Isso não nos ajuda muito, por isso precisamos de processá-lo.

Passo 3: Extrair o HTML da página

Para extrair algumas informações úteis do nosso resultado, vamos instalar a biblioteca beautifulsoup:

pip install beautifulsoup4

Vamos primeiro formatar o nosso resultado de forma mais legível:

import requests
from bs4 import BeautifulSoup
 
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)
 
soup = BeautifulSoup(page.content, 'html.parser')
prettyHTML = soup.prettify()
print(prettyHTML)

Convertemos o resultado anterior num objeto BeautifulSoup. Com o atributo .content, pode aceder aos dados HTML. Ao aplicar o método .prettify(), pode ver o mesmo formato que viu anteriormente no seu navegador.

Infelizmente, nem todos os sites fornecem o seu HTML completo desta forma. Como referido anteriormente, existem alguns desafios que os web scrapers enfrentam.

Passo 3.1: Conteúdo dinâmico

Por exemplo, algumas páginas só ficam visíveis após o login. Mesmo que se autentique a partir do seu navegador, o seu script Python não conseguirá aceder aos dados.

Outra situação comum é a dos sites dinâmicos. Isso significa que a resposta à solicitação GET não é um documento HTML, mas um script de Javascript. Mesmo que consiga ver o HTML no navegador, isso ocorre porque o script é executado. Mas, no seu código, precisa de executar o script localmente para obter o HTML.

Mas vamos ver esta situação na prática. Vamos escolher um exemplo minimalista de um site criado rapidamente a partir de um exercício universitário antigo: https://dynamic-website.surge.sh.

Pode ver o HTML completo no seu navegador. Neste exemplo, trata-se de uma tabela que contém imagens nas suas células.

import requests
from bs4 import BeautifulSoup
 
URL = 'https://dynamic-website.surge.sh'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Agora vamos extrair este HTML, o que significa que vamos executar o mesmo código de antes, com algumas alterações: atualizámos o URL e abrimos um ficheiro de texto para guardar o nosso resultado. Executamos o programa e verificamos o ficheiro page.txt para ver se contém a mesma secção da tabela.

O que é isto? Onde está a tabela? Bem, ela está lá, só que ainda não havia ninguém para a gerar. Pode verificar a tag <head> do documento HTML para ver se há algum script utilizado:

E sim, usamos um script.

Para resolver este problema, precisamos do Selenium, uma biblioteca utilizada para testes web e automatização de atividades do navegador. Vamos utilizá-la no modo headless, o que significa que se comportará como um navegador normal que executa o código JavaScript, mas sem interface de utilizador visível.

pip install selenium

Neste tutorial, vamos usar o ChromeDriver para configurar o web driver para o Selenium. Lembre-se apenas de copiar o caminho onde o descarregou! Guardámo-lo no diretório C, mas qualquer localização serve.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
 
CHROMEDRIVER_PATH = "your/path/here/chromedriver_win32/chromedriver"
URL = "https://dynamic-website.surge.sh"
 
options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, options=options)
 
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

O resto do processo é praticamente o mesmo, exceto que já não usamos a biblioteca requests para fazer o pedido HTTP.

Executamos o programa novamente e…

...Voilà! Agora temos o HTML completo.

Passo 4: Extrair secções específicas

Muito bem, vamos voltar ao que nos ocupava.

Ter o HTML completo é um excelente progresso, mas o processo ainda não terminou. Na maioria das vezes, precisamos de informações específicas de um site, por isso vamos ver como podemos extraí-las.

Vamos começar com algo pequeno: o título do site. Pode encontrá-lo na secção <head> do HTML, dentro de uma tag &lt;title>.

Sabemos que um site tem apenas um título, por isso vamos usar o método .find(). Este método recebe o nome da tag como entrada e devolve o elemento HTML; assim, se precisares do seu conteúdo, basta aceder-lhe através do atributo .text. Além disso, vamos adicionar um pouco de estrutura ao nosso pequeno scraper.

def extract_title(soup):
    title = soup.find('title')
 
    #output: <title>Beer - Wikipedia</title>    
    print('Title element: ', title)
 
    #output: Beer - Wikipedia
    print('Title: ', title.text)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_title(soup)
 
main()

Não há nada de complicado aqui. O BeautifulSoup é uma biblioteca poderosa e suporta vários padrões de extração de dados específicos. Pode obter elementos HTML pelo seu nome, id e atributo de classe, ou pode até usar seletores CSS. O céu é o limite!

Vamos avançar para mais, como extrair elementos que aparecem mais do que uma vez. Neste caso, usamos o método .find_all(). A única diferença é que este devolve uma lista de elementos em vez de apenas um. É por isso que, depois disso, percorremos a lista e exibimos os atributos de cada elemento. A título de exemplo, extraímos todas as imagens do artigo:

def extract_images(soup):
    images = soup.find_all('img')
    for image in images:
        imageAlt = image.get('alt')
        imageSrc = image.get('src')
        print("ALT: ", imageAlt, "SRC: ", imageSrc)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_images(soup)
 
main()

Passo 5: Passar funções durante o scraping

Uma situação comum no web scraping é quando a lista de resultados da análise é muito longa e contém informações mistas.

Por exemplo, deve ter reparado que as nossas imagens anteriores podem ou não conter um atributo alt.

Ou imagine que iríamos extrair todos os links do artigo. Todos sabemos que um artigo da Wikipédia tem MUITOS links, e talvez não queiramos uma lista completa deles. O resultado terá links externos e internos, referências e citações, por isso precisamos de os classificar em várias categorias.

Para resolver este problema, vamos utilizar uma função lambda. Basicamente, a função lambda irá receber como parâmetro cada elemento da lista de resultados e aplicar a condição que definirmos, tal como se utilizássemos um filtro.

Para um exemplo prático, vamos supor que precisamos de extrair todos os links internos, aceder aos respetivos artigos e fazer um resumo de cada um. Considerando que um dos casos de utilização do Python é a Inteligência Artificial, este exemplo pode ser uma excelente aplicação para obter dados de treino.

Em primeiro lugar, precisaremos de instalar a biblioteca NLTK, pois calcular um resumo implica processar a linguagem humana.

pip install -U nltk

E, claro, importá-la para o nosso código:

import re
import nltk
import heapq
# need to download only for the first execution
# warning: the size of the dataset is big; hence it will take time
nltk.download()

Nota: se for utilizador do macOS, poderá receber um erro “SSL: falha na verificação do certificado”. A causa pode ser o facto de o Python 3.6 utilizar uma versão incorporada do OpenSSL. Basta abrir o local onde instalou o Python e executar este ficheiro:

/Your/Path/Here/Python 3.6/Install Certificates.command

Como pode ver, também importámos a biblioteca re, utilizada para operações com expressões regulares, e a heapq, uma implementação de fila de heap.

Ótimo, temos tudo o que precisamos para começar a escrever o código. Vamos começar por extrair os links internos. Se voltares ao navegador, irás notar algumas coisas sobre os elementos que nos interessam.

Essas coisas seriam:

  • O atributo href tem um valor;
  • O valor de href começa com “/wiki/”;
  • O pai do link é uma tag ;

Estas características vão ajudar-nos a diferenciar os links de que precisamos de todos os outros.

Agora que sabemos como encontrar os links, vamos ver como podemos extraí-los.

count = 0
 
def can_do_summary(tag):
    global count
    if count > 10: return False
 
    # Reject if parent is not a paragraph
    if not tag.parent.name == 'p': return False
 
    href = tag.get('href')
    # Reject if href is not set
    if href is None: return False
 
    # Reject is href value does not start with /wiki/
    if not href.startswith('/wiki/'): return False
 
    compute_summary(href)
    return True
 
 
def extract_links(soup):
    soup.find_all(lambda tag: tag.name == 'a' and can_do_summary(tag))
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_links(soup)
 
main()

Muito bem, então o que aconteceu aqui? Olhando para a função extract_links(), podemos ver que, em vez do nome de uma tag, passámos uma função lambda como parâmetro para o método .find_all(). Isso significa que selecionamos apenas aquelas que correspondem à nossa condição entre todas as tags do documento HTML.

Como pode ver, a condição de uma tag é ser um link e ser aceite pela função can_do_summary() definida acima. Ali, rejeitamos tudo o que não corresponda às características observadas anteriormente. Além disso, utilizámos uma variável global para limitar o número de links extraídos a 10. Se precisar de todos eles, sinta-se à vontade para remover a variável count.

No final, chamamos a função compute_summary() para o link recém-encontrado. É aí que o artigo é resumido.

def compute_summary(href):
    global count
    full_link = 'https://en.wikipedia.org' + href
    page = requests.get(full_link)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    # Concatenate article paragraphs
    paragraphs = soup.find_all('p')
    article_text = ""
    for p in paragraphs:
        article_text += p.text
 
    # Removing Square Bracket, extra spaces, special characters and digits
    article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)
    article_text = re.sub(r'\s+', ' ', article_text)
    formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text)
    formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)
 
    # Converting text to sentences
    sentence_list = nltk.sent_tokenize(article_text)
 
    # Find frequency of occurrence of each word
    stopwords = nltk.corpus.stopwords.words('english')
 
    word_frequencies = {}
    for word in nltk.word_tokenize(formatted_article_text):
        if word not in stopwords:
            if word not in word_frequencies.keys():
                word_frequencies[word] = 1
            else:
                word_frequencies[word] += 1
 
    maximum_frequency = max(word_frequencies.values())
 
    for word in word_frequencies.keys():
        word_frequencies[word] = (word_frequencies[word] / maximum_frequency)
 
    # Calculate the score of each sentence
    sentence_scores = {}
    for sent in sentence_list:
        for word in nltk.word_tokenize(sent.lower()):
            if word in word_frequencies.keys():
                if len(sent.split(' ')) < 30:
                    if sent not in sentence_scores.keys():
                        sentence_scores[sent] = word_frequencies[word]
                    else:
                        sentence_scores[sent] += word_frequencies[word]
 
    # Pick top 7 sentences with highest score
    summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
    summary = '\n'.join(summary_sentences)
    count += 1

Resumindo, fazemos um pedido HTTP para o URL recém-descoberto e convertemos o resultado num objeto BeautifulSoup, tal como fizemos no início do artigo.

Para calcular um resumo, extraímos todos os parágrafos do artigo e concatenamo-los. Depois disso, removemos todos os caracteres especiais que possam interferir nos cálculos.

Em termos simples, um resumo é feito calculando as palavras mais frequentes e atribuindo a cada frase uma pontuação com base na frequência das suas palavras. No final, selecionamos as 7 frases com a pontuação mais elevada.

Este não é o tema do nosso artigo, mas pode ler mais aqui se estiver curioso ou mesmo interessado em Processamento de Linguagem Natural.

Passo 6: Gerar um CSV para armazenar os seus dados

Passando para o último passo deste guia, precisamos de analisar os resultados da extração. Até agora, apenas os apresentámos no terminal porque havia apenas algumas linhas de dados.

Mas o scraping na vida real implica uma quantidade considerável de informação, por isso devemos ver como podemos guardar os resultados num ficheiro.

Vamos usar a biblioteca nativa csv (por isso não há necessidade de instalar mais nada) e abrir um ficheiro chamado summaries.csv.

import csv
summaries_file = open('summaries.csv', mode='a', encoding='utf-8')

A biblioteca criará o ficheiro se este não existir. Além disso, abrimos o ficheiro no modo «append», porque cada link é processado sequencialmente, um por um.

    summaries_writer = csv.writer(summaries_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    summaries_writer.writerow([full_link, summary])

No final da função compute_summary(), basta inicializar o writer e começar a acrescentar os dados. Uma linha é composta pela URL do artigo e pelo seu resumo.

Passo 6.1: Gerar um ficheiro JSON

Outro formato de serialização de dados que se tornou popular nos últimos anos é o JavaScript Object Notation (JSON). É facilmente legível por humanos e útil se pretender passar os dados extraídos para uma API ou outra aplicação.

Em Python, a forma mais fácil de escrever um ficheiro JSON é passar os dados para um objeto dict.

import json
 
summaries_file = open('summaries.json', mode='a', encoding='utf-8')
data = {}
data['summaries'] = []

Vamos usar a biblioteca nativa para ficheiros JSON e abrir um novo ficheiro, tal como fizemos anteriormente com o nosso ficheiro CSV. Em seguida, inicializamos um objeto dict vazio e uma lista vazia que irá conter os nossos resumos.

data['summaries'].append({
'url': full_link,
      'summary': summary
})

No final da função compute_summary(), exatamente onde escrevemos no CSV anteriormente, agora acrescentamos um novo objeto dict à lista final.

json.dump(data, summaries_file, indent=4)

E, por último, na nossa função main(), depois de executarmos o processo extract_links(), gravamos o objeto final no ficheiro. O parâmetro indent apenas formata o resultado de forma mais elegante.

Conclusão e alternativas

Bem, é isso, o fim do nosso tutorial. Espero que tenha sido útil e lhe tenha dado uma boa visão sobre web scraping usando Python.

Aprendemos sobre as suas vantagens e como pode melhorar o seu negócio/aplicação. Ao mesmo tempo, equilibrámos esta informação com alguns dos desafios encontrados na extração de dados da web.

Se é um programador, poderá achar emocionante construir o seu próprio web scraper, superando todas estas questões. Pode ser uma experiência de aprendizagem interessante.

Mas, como empresário (ou como alguém que precisa de dados para uma aplicação real em grande escala), talvez queira evitar os custos envolvidos (tempo, dinheiro, pessoal).

Nesta situação, a utilização de uma API dedicada resolverá o problema. A WebScrapingAPI supera todos os possíveis obstáculos: renderização de Javascript, proxies, CAPTCHAs, etc., e oferece funcionalidades personalizáveis. Além disso, se não estiver totalmente certo quanto a isso, lembre-se de que existe uma opção de plano gratuito, por isso, porque não experimentar?

Sobre o autor
Raluca Penciuc, Desenvolvedor Full-Stack @ WebScrapingAPI
Raluca PenciucDesenvolvedor Full-Stack

Raluca Penciuc é programadora Full Stack na WebScrapingAPI, onde desenvolve scrapers, aperfeiçoa estratégias de evasão e procura formas fiáveis de reduzir a deteção nos sites-alvo.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.