Como extrair dados SERP do DuckDuckGo: 4 abordagens eficazes

Explore como extrair resultados de pesquisa do DuckDuckGo com scripts Python, a biblioteca DDGS, a API SERP da Bright Data ou por meio do MCP para agentes de IA.
2 min de leitura
How to Scrape DuckDuckGo

Neste guia, você verá:

  • Tudo o que você precisa saber para dar os primeiros passos com o scraping do DuckDuckGo.
  • As abordagens mais populares e eficazes para Scraping de dados no DuckDuckGo.
  • Como criar um Scraper personalizado do DuckDuckGo.
  • Como usar a biblioteca DDGS para fazer scraping no DuckDuckGo.
  • Como recuperar dados de resultados de mecanismos de pesquisa por meio da API SERP da Bright Data.
  • Como fornecer dados de pesquisa do DuckDuckGo a um agente de IA por meio do MCP.

Vamos começar!

Introdução ao scraping do DuckDuckGo

O DuckDuckGo é um mecanismo de pesquisa que oferece proteção integrada contra rastreadores online. Os usuários apreciam sua política focada na privacidade, pois ele não rastreia pesquisas ou histórico de navegação. Dessa forma, ele se destaca das plataformas de pesquisa convencionais e tem visto um aumento constante no uso ao longo dos anos.

O mecanismo de pesquisa DuckDuckGo está disponível em duas variantes:

  • Versão dinâmica: a versão padrão, que requer JavaScript e inclui recursos como“Search Assist”, uma alternativa às visões gerais da IA do Google.
  • Versão estática: uma versão simplificada que funciona mesmo sem renderização JavaScript.

Dependendo da versão escolhida, serão necessárias diferentes abordagens de scraping, conforme descrito nesta tabela resumida:

Recurso Versão SERP dinâmica Versão SERP estática
JavaScript necessário Sim Não
Formato da URL https://duckduckgo.com/?q=<SEARCH_QUERY> https://html.duckduckgo.com/html/?q=<SEARCH_QUERY>
Conteúdo dinâmico Sim, como resumos de IA e elementos interativos Não
Paginação Complexa, com base no botão “Mais resultados” Simples, por meio de um botão tradicional “Próximo” com recarga da página
Abordagem de scraping Ferramentas de automação do navegador Cliente HTTP + analisador HTML

É hora de explorar as implicações do scraping para as duas versões da SERP (página de resultados do mecanismo de pesquisa) do DuckDuckGo!

DuckDuckGo: Versão SERP dinâmica

Por padrão, o DuckDuckGo carrega uma página da web dinâmica que requer renderização JavaScript, com uma URL como:

https://duckduckgo.com/?q=<SEARCH_QUERY>
An example of the dynamic version of a DuckDuckGo SERP

Esta versão inclui interações complexas do usuário na página, como o botão “Mais resultados” para carregar dinamicamente outros resultados:

The “More Results" button

A SERP dinâmica do DuckDuckGo vem com mais recursos e informações mais ricas, mas requer ferramentas de automação do navegador para o scraping. O motivo é que apenas um navegador pode renderizar páginas que dependem de JavaScript.

O problema é que controlar um navegador introduz complexidade adicional e uso de recursos. É por isso que a maioria dos Scrapers depende da versão estática do site!

DuckDuckGo: versão estática do SERP

Para dispositivos que não suportam JavaScript, o DuckDuckGo também suporta uma versão estática de seus SERPs. Essas páginas seguem um formato de URL como abaixo:

https://html.duckduckgo.com/html/?q=<SEARCH_QUERY>
An example of the static version of a DuckDuckGo SERP

Essa versão não inclui conteúdo dinâmico, como o resumo gerado pela IA. Além disso, a paginação segue uma abordagem mais tradicional, com um botão “Próximo” que leva você para a próxima página:

The “Next” button for “traditional” pagination behavior

Como essa SERP é estática, você pode extraí-la usando uma abordagem tradicional de cliente HTTP + analisador HTML. Esse método é mais rápido, mais fácil de implementar e consome menos recursos.

Abordagens possíveis para extrair dados do DuckDuckGo

Confira as quatro abordagens possíveis para o Scraping de dados do DuckDuckGo que apresentaremos neste artigo:

Abordagem Complexidade da integração Requer Preço Risco de bloqueios Escalabilidade
Criar um Scraper personalizado Médio/Alto Conhecimentos de programação em Python Gratuito (pode exigir proxies premium para evitar bloqueios) Possível Limitado
Depende de uma biblioteca de scraping do DuckDuckGo Baixo Conhecimentos de Python / uso de CLI Gratuito (pode exigir proxies premium para evitar bloqueios) Possível Limitado
Use a API SERP da Bright Data Baixo Qualquer cliente HTTP Pago Nenhum Ilimitado
Integrar o servidor Web MCP Baixo Estruturas/soluções de agentes de IA compatíveis com MCP Nível gratuito disponível, depois pago Nenhuma Ilimitado

Você aprenderá mais sobre cada um deles ao longo deste tutorial.

Independentemente da abordagem que você seguir, a consulta de pesquisa alvo nesta postagem do blog será “agentic rag”. Em outras palavras, você verá como recuperar os resultados de pesquisa do DuckDuckGo para essa consulta.

Vamos supor que você já tenha o Python instalado localmente e esteja familiarizado com ele.

Abordagem nº 1: criar um Scraper personalizado

Utilize uma ferramenta de automação de navegador ou um cliente HTTP combinado com um analisador HTML para criar um bot de Scraping de dados do DuckDuckGo do zero.

👍 Prós:

  • Controle total sobre a lógica de scraping.
  • Pode ser personalizado para extrair exatamente o que você precisa.

👎 Contras:

  • Requer configuração e codificação.
  • Pode encontrar bloqueios de IP se a extração for em grande escala.

Abordagem nº 2: Confie em uma biblioteca de raspagem do DuckDuckGo

Use uma biblioteca de scraping existente para o DuckDuckGo, como o DDGS (Duck Distributed Global Search), que oferece todas as funcionalidades necessárias sem precisar escrever uma única linha de código.

👍 Prós:

  • Configuração mínima necessária.
  • Lida com tarefas de scraping de mecanismos de pesquisa automaticamente, por meio de código Python ou comandos CLI simples.

👎 Contras:

  • Menos flexibilidade em comparação com um Scraper personalizado, com controle limitado sobre casos de uso avançados.
  • Ainda enfrenta bloqueios de IP.

Abordagem nº 3: Use a API SERP da Bright Data

Aproveite o endpoint premium da API SERP da Bright Data, que você pode chamar a partir de qualquer cliente HTTP. Ele oferece suporte a vários mecanismos de pesquisa, incluindo o DuckDuckGo. Ele lida com todas as complexidades para você, ao mesmo tempo em que fornece raspagem escalável e de alto volume.

👍 Prós:

  • Escalabilidade ilimitada.
  • Evita bloqueios de IP e medidas anti-bot.
  • Integra-se com clientes HTTP em qualquer linguagem de programação ou mesmo com ferramentas visuais como o Postman.

👎 Contras:

  • Serviço pago.

Abordagem nº 4: integrar o servidor Web MCP

Forneça ao seu agente de IA recursos de scraping do DuckDuckGo acessando a API SERP da Bright Data gratuitamente através do Bright Data Web MCP.

👍 Prós:

  • Fácil integração com IA.
  • Nível gratuito disponível.
  • Fácil de usar em agentes de IA e fluxos de trabalho.

👎 Contras:

  • Não é possível controlar totalmente os LLMs.

Abordagem nº 1: Crie um Scraper DuckDuckGo personalizado com Python

Siga as etapas abaixo para aprender a criar um script de scraping personalizado do DuckDuckGo em Python.

Observação: para um Parsing simplificado e rápido, usaremos a versão estática do DuckDuckGo. Se você estiver interessado em coletar “Assistências de Pesquisa” geradas por IA, leia nosso guia sobre como criar um scraper para resultados de visão geral de IA do Google. Você pode adaptá-lo facilmente ao DuckDuckGo.

Etapa 1: Configure seu projeto

Comece abrindo seu terminal e criando uma nova pasta para seu projeto de Scraper DuckDuckGo:

mkdir duckduckgo-Scraper

A pasta duckduckgo-scraper/ conterá seu projeto de scraping.

Em seguida, navegue até o diretório do projeto e crie um ambiente virtual Python dentro dele:

cd duckduckgo-Scraper
python -m venv .venv

Agora, abra a pasta do projeto em seu IDE Python preferido. Recomendamos o Visual Studio Code com a extensão Python ou o PyCharm Community Edition.

Crie um novo arquivo chamado scraper.py na raiz do diretório do seu projeto. A estrutura do seu projeto deve ficar assim:

duckduckgo-Scraper/
├── .venv/
└── agent.py

No terminal, ative o ambiente virtual. No Linux ou macOS, execute:

source venv/bin/activate

De forma equivalente, no Windows, execute:

venv/Scripts/activate

Com o ambiente virtual ativado, instale as dependências do projeto com:

pip install requests beautifulsoup4

As duas bibliotecas necessárias são:

Ótimo! Seu ambiente de desenvolvimento Python agora está pronto para criar um script de scraping do DuckDuckGo.

Etapa 2: Conecte-se à página de destino

Comece importando requests em scraper.py:

import requests

Em seguida, execute uma solicitação GET semelhante à de um navegador para a versão estática do DuckDuckGo usando o método requests.get():

# URL base da versão estática do DuckDuckGo
base_url = "https://html.duckduckgo.com/html/"

# Exemplo de consulta de pesquisa
search_query = "agentic rag"

# Para simular uma solicitação do navegador e evitar erros 403
headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}

# Conecte-se à página SERP de destino
params = {
    "q": search_query
}
response = requests.get(base_url, params=params, headers=headers)

Se você não estiver familiarizado com essa sintaxe, consulte nosso guia sobre solicitações HTTP em Python.

O trecho acima enviará uma solicitação HTTP GET para https://html.duckduckgo.com/html/?q=agentic+rag (a SERP de destino deste tutorial) com o seguinte cabeçalho User-Agent:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/140.0.0.0 Safari/537.36

É necessário definir um User-Agent real como o acima para evitar receber erros 403 Forbidden do DuckDuckGo. Saiba mais sobre a importância do cabeçalho User-Agent no Scraping de dados.

O servidor responderá à solicitação GET com o HTML da página estática do DuckDuckGo. Acesse-a com:

html = response.text

Verifique o conteúdo da página imprimindo-o:

print(html)

Você deverá ver um HTML semelhante a este:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=3.0, user-scalable=1" />
    <meta name="referrer" content="origin" />
    <meta name="HandheldFriendly" content="true" />
    <meta name="robots" content="noindex, nofollow" />
    <title>agentic rag no DuckDuckGo</title>
    <!-- Omitido por brevidade... -->
  </head>
  <!-- Omitido por brevidade... -->
  <body>
    <div>
      <div class="serp__results">
        <div id="links" class="results">

          <div class="result results_links results_links_deep web-result">
            <div class="links_main links_deep result__body">
              <h2 class="result__title">
                <a rel="nofollow" class="result__a"
                  href="//duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.geeksforgeeks.org%2Fartificial%2Dintelligence%2Fwhat%2Dis%2Dagentic%2Drag%2F&amp;rut=db125a181b0852a6be3a488cb8060da7f7359f97d50cdc2b70fd9cd4dd3d1df9">
                  O que é Agentic RAG? - GeeksforGeeks
                </a>
              </h2>
              <!-- Omitido por brevidade... -->
            </div>
          </div>
          <!-- Outros resultados ... -->
        </div>
      </div>
    </div>
  </body>
</html>

Ótimo! Este HTML contém todos os links SERP que você está interessado em extrair.

Etapa 3: Parsing do HTML

Importe o Beautiful Soup no scraper.py:

from bs4 import BeautifulSoup

Em seguida, use-o para realizar o Parsing da string HTML recuperada anteriormente em uma estrutura de árvore navegável:

soup = BeautifulSoup(html, "html.parser")

Isso realiza o Parsing do HTML usando o "html.parser" integrado ao Python. Você também pode configurar outros analisadores, como lxml ou html5lib, conforme explicado em nosso guia de Scraping de dados do BeautifulSoup.

Muito bem! Agora você pode usar a API do BeautifulSoup para selecionar elementos HTML na página e extrair os dados necessários.

Etapa 4: Prepare-se para extrair todos os resultados da SERP

Antes de se aprofundar na lógica de scraping, você deve se familiarizar com a estrutura das SERPs do DuckDuckGo. Abra esta página da web no modo de navegação anônima (para garantir uma sessão limpa) no seu navegador:

https://html.duckduckgo.com/html/?q=agentic+rag

Em seguida, clique com o botão direito do mouse em um elemento do resultado SERP e selecione a opção “Inspecionar” para abrir o DevTools do navegador:

Inspecting the target DuckDuckGo page

Dê uma olhada na estrutura HTML. Observe que cada elemento SERP tem a classe de resultado e está contido em um <div> identificado pelo ID dos links. Isso significa que você pode selecionar todos os elementos de resultado de pesquisa usando este seletor CSS:

#links .result

Aplique esse seletor à página parsed com o método select() do Beautiful Soup:

result_elements = soup.select("#links .result") 

Como a página contém vários elementos SERP, você precisará de uma lista para armazenar os dados coletados. Inicialize uma lista assim:

serp_results = []

Por fim, itere sobre cada elemento HTML selecionado. Prepare-se para aplicar sua lógica de coleta para extrair os resultados de pesquisa do DuckDuckGo e preencher a lista serp_results:

para result_element em result_elements:
    # Lógica de Parsing de dados...

Ótimo! Agora você está perto de atingir seu objetivo de extração do DuckDuckGo.

Etapa 5: extraia os dados dos resultados

Mais uma vez, inspecione a estrutura HTML de um elemento SERP na página de resultados:

Note the HTML structure of the SERP element

Desta vez, concentre-se nos seus nós HTML aninhados. Como você pode ver, a partir desses elementos, você pode extrair:

  • Título do resultado do texto .result__a
  • URL do resultado do atributo .result__a href
  • URL de exibição do texto .result__url
  • Trecho/descrição do resultado a partir do texto .result__snippet

Aplique o método select_one() do BeautifulSoup para selecionar o nó específico e, em seguida, use .get_text() para extrair o texto ou [<attribute_name>] para acessar um atributo HTML.

Implemente a lógica de scraping com:

title_element = result_element.select_one(".result__a")
url = "https:" + title_element["href"]
title = title_element.get_text(strip=True)

url_element = result_element.select_one(".result__url")
display_url = url_element.get_text(strip=True)

snippet_element = result_element.select_one(".result__snippet")
snippet = snippet_element.get_text(strip=True)

Observação: strip=True é útil porque remove os espaços em branco à esquerda e à direita do texto extraído.

Se você está se perguntando por que precisa concatenar “https:” a title_element["href"], é porque o HTML retornado pelo servidor é ligeiramente diferente daquele renderizado no seu navegador. O HTML bruto, que o seu Scraper realmente analisa, contém URLs em um formato como este:

//duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.geeksforgeeks.org%2Fartificial%2Dintelligence%2Fwhat%2Dis%2Dagentic%2Drag%2F&amp;rut=db125a181b0852a6be3a488cb8060da7f7359f97d50cdc2b70fd9cd4dd3d1df9

Como você pode ver, a URL começa com // em vez de incluir o esquema (https://). Ao adicionar “https:” no início, você garante que a URL se torne mais utilizável (fora dos navegadores, que também suportam esse formato).

Verifique você mesmo esse comportamento. Clique com o botão direito do mouse na página e escolha a opção “Exibir código-fonte da página”. Isso mostrará o documento HTML bruto retornado pelo servidor (sem qualquer renderização do navegador aplicada). Você verá links SERP nesse formato:

Note the format of the SERP link

Agora, com os campos de dados extraídos, crie um dicionário para cada resultado de pesquisa e anexe-o à lista serp_results:

serp_result = {
  "url": url,
  "title": title,
  "display_url": display_url,
  "snippet": snippet
}
serp_results.append(serp_result) 

Perfeito! Sua lógica de Scraping de dados da web do DuckDuckGo está completa. Resta apenas exportar os dados coletados.

Etapa 6: exporte os dados coletados para CSV

Neste ponto, você tem os resultados da pesquisa do DuckDuckGo armazenados em uma lista Python. Para tornar esses dados utilizáveis por outras equipes ou ferramentas, exporte-os para um arquivo CSV usando a biblioteca csv integrada do Python:

with open("duckduckgo_results.csv", "w", newline="", encoding="utf-8") as f:
    headers = serp_results[0].keys()
    writer = csv.DictWriter(f, fieldnames=headers)

    # Escreva o cabeçalho
    writer.writeheader()

    # Escreva todas as linhas de dados
    writer.writerows(serp_results)

Não se esqueça de importar o csv:

import csv

Dessa forma, seu scraper DuckDuckGo produzirá um arquivo de saída chamado duckduckgo_results.csv contendo todos os resultados coletados no formato CSV. Missão cumprida!

Etapa 7: Junte tudo

O código final contido em scraper.py é:

import requests
from bs4 import BeautifulSoup
import csv

# URL base da versão estática do DuckDuckGo
base_url = "https://html.duckduckgo.com/html/"

# Exemplo de consulta de pesquisa
search_query = "agentic rag"

# Para simular uma solicitação do navegador e evitar erros 403
headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
}

# Conecte-se à página SERP de destino
params = {
    "q": search_query
}
response = requests.get(base_url, params=params, headers=headers)
# Recupere o conteúdo HTML da resposta
html = response.text

# Analisar o HTML
soup = BeautifulSoup(html, "html.parser")

# Encontrar todos os contêineres de resultados
result_elements = soup.select("#links .result")

# Onde armazenar os dados extraídos
serp_results = []

# Iterar sobre cada resultado SERP e extrair dados dele
para result_element em result_elements:
    # Lógica de Parsing
    title_element = result_element.select_one(".result__a")
    url = "https:" + title_element["href"]
    title = title_element.get_text(strip=True)

    url_element = result_element.select_one(".result__url")
    display_url = url_element.get_text(strip=True)

    snippet_element = result_element.select_one(".result__snippet")
    snippet = snippet_element.get_text(strip=True)

    # Preencha um novo objeto de resultado SERP e acrescente-o à lista
    serp_result = {
      "url": url,
      "title": title,
      "display_url": display_url,
      "snippet": snippet
    }
    serp_results.append(serp_result)

# Exportar os dados coletados para CSV
com open("duckduckgo_results.csv", "w", newline="", encoding="utf-8") como f:
    headers = serp_results[0].keys()
    writer = csv.DictWriter(f, fieldnames=headers)

    # Escreva o cabeçalho
    writer.writeheader()

    # Escreva todas as linhas de dados
    writer.writerows(serp_results)

Uau! Em menos de 65 linhas de código, você acabou de criar um script de extração de dados do DuckDuckGo.

Execute-o com este comando:

python Scraper.py

O resultado será um arquivo duckduckgo_results.csv, que aparecerá na pasta do seu projeto. Abra-o e você verá os dados coletados assim:

The duckduckgo_results.csv produced by the script

Et voilà! Você transformou resultados de pesquisa não estruturados de uma página da web do DuckDuckGo em um arquivo CSV estruturado.

[Extra] Integre proxies rotativos para evitar bloqueios

O Scraper acima funciona bem para pequenas execuções, mas não terá muito escalabilidade. Isso porque o DuckDuckGo começará a bloquear suas solicitações se perceber muito tráfego proveniente do mesmo IP. Quando isso acontece, seus servidores começam a retornar páginas de erro 403 Forbidden contendo uma mensagem como esta:

Se isso persistir, envie um e-mail para <a href="mailto:[email protected]?subject=Error getting results">nós</a>.<br />
Nosso endereço de e-mail de suporte inclui um código de erro anônimo que nos ajuda a entender o contexto da sua pesquisa.

Isso significa que o servidor identificou sua solicitação como automatizada e a bloqueou, geralmente devido a um problema de limitação de taxa. Para evitar bloqueios, você precisa alternar seu endereço IP.

A solução é enviar solicitações por meio de um Proxy rotativo. Se você quiser saber mais sobre esse mecanismo, consulte nosso guia sobre como alternar um endereço IP.

A Bright Data oferece proxies rotativos apoiados por uma rede de mais de 150 milhões de IPs. Veja como integrá-los ao seu Scraper DuckDuckGo para evitar bloqueios!

Siga o guia oficial de configuração de Proxy e você obterá uma string de conexão de Proxy semelhante a esta:

<BRIGHT_DATA_PROXY_USERNAME>:<BRIGHT_DATA_PROXY_PASSWORD>@brd.superproxy.io:33335
The residential rotating proxy configuration in the Bright Data dashboard

Defina o Proxy em Solicitações, conforme abaixo:

proxy_url = "http://<BRIGHT_DATA_PROXY_USERNAME>:<BRIGHT_DATA_PROXY_PASSWORD>@brd.superproxy.io:33335"
proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

# definição de parâmetros e cabeçalhos...

response = requests.get(
    base_url,
    params=params,
    headers=headers,
    proxies=proxies,   # encaminhe a solicitação através do Proxy rotativo
    verify=False,
)

Observação: verify=False desativa a verificação do certificado SSL. Isso evitará erros relacionados à validação do certificado do Proxy, mas não é seguro. Para uma implementação mais pronta para produção, consulte nossa página de documentação sobre validação de certificado SSL.

Agora, suas solicitações GET para o DuckDuckGo serão roteadas através da rede de Proxy residencial de 150 milhões de IPs da Bright Data, garantindo um IP novo a cada vez e ajudando você a evitar bloqueios relacionados ao IP.

Abordagem nº 2: contar com uma biblioteca de scraping do DuckDuckGo, como DDGS

Nesta seção, você aprenderá como usar a biblioteca DDGS. Este projeto de código aberto, com mais de 1,8 mil estrelas no GitHub, era anteriormente conhecido como duckduckgo-search porque se concentrava especificamente no DuckDuckGo. Recentemente, ele foi renomeado para DDGS (Dux Distributed Global Search), pois agora também oferece suporte a outros mecanismos de pesquisa.

Aqui, veremos como usá-lo a partir da linha de comando para extrair resultados de pesquisa do DuckDuckGo!

Passo 1: Instalar o DDGS

Instale o DDGS globalmente ou dentro de um ambiente virtual através do pacote ddgs PyPI:

pip install -U ddgs

Depois de instalado, você pode acessá-lo através da ferramenta de linha de comando ddgs. Verifique a instalação executando:

ddgs --help

A saída deve ser semelhante a esta:

Como você pode ver, a biblioteca oferece suporte a vários comandos para extrair diferentes tipos de dados (por exemplo, texto, imagens, notícias etc.). Neste caso, você usará o comando text, que tem como alvo os resultados de pesquisa das SERPs.

Observação: você também pode chamar esses comandos por meio da API DDGS no código Python, conforme explicado na documentação.

Etapa 2: use o DDGS via CLI para Scraping de dados da Web do DuckDuckGo

Primeiro, familiarize-se com o comando text executando:

ddgs text --help

Isso exibirá todos os sinalizadores e opções suportados:

The result of the text --help command

Para extrair os resultados de pesquisa do DuckDuckGo para “agentic rag” e exportá-los para um arquivo CSV, execute:

ddgs text -q "agentic rag" -b duckduckgo -o duckduckgo_results.csv

O resultado será um arquivo duckduckgo_results.csv. Abra-o e você verá algo como:

The resulting duckduckgo_results.csv file

Incrível! Você obteve os mesmos resultados de pesquisa que com o Scraper Python DuckDuckGo personalizado, mas com um único comando CLI.

[Extra] Integrar um Proxy rotativo

Como você acabou de ver, o DDGS é uma ferramenta extremamente poderosa de pesquisa SERP e Scraping de dados. Ainda assim, não é mágica. Em projetos de scraping em grande escala, ele encontrará os mesmos bloqueios e proibições de IP mencionados anteriormente.

Para evitar esses problemas, assim como antes, você precisa de um Proxy rotativo. Não é de se admirar que o DDGS venha com suporte nativo para integração de Proxy por meio do sinalizador -pr (ou --proxy).

Recupere sua URL de Proxy rotativo da Bright Data e defina-a em seu comando ddgs CLI desta forma:

ddgs text -q "agentic rag" -b duckduckgo -o duckduckgo_results.csv -pr <BRIGHT_DATA_PROXY_USERNAME>:<BRIGHT_DATA_PROXY_PASSWORD>@brd.superproxy.io:33335

Pronto! As solicitações da web subjacentes feitas pela biblioteca agora serão roteadas através da rede de Proxy rotativo da Bright Data. Isso permite que você faça scraping de dados com segurança, sem se preocupar com bloqueios relacionados ao IP.

Abordagem nº 3: usando a API SERP da Bright Data

Neste capítulo, você aprenderá como usar a API SERP tudo-em-um da Bright Data para recuperar programaticamente os resultados de pesquisa da versão dinâmica do DuckDuckGo. Siga as instruções abaixo para começar!

Observação: para uma configuração simplificada e mais rápida, presumimos que você já tenha um projeto Python em funcionamento com a biblioteca de solicitações instalada.

Etapa 1: Configure sua zona da API SERP da Bright Data

Primeiro, crie uma conta Bright Data ou faça login se você já tiver uma. Abaixo, você será guiado pelo processo de configuração do produto API SERP para scraping do DuckDuckGo.

Para uma configuração mais rápida, você também pode consultar o guia oficial “Quick Start” (Início rápido) da API SERP. Caso contrário, continue com as etapas a seguir.

Depois de fazer login, navegue até sua conta Bright Data e clique na opção “Proxies & Scraping” para acessar esta página:

Verifique a tabela “Minhas zonas”, que lista seus produtos Bright Data configurados. Se já existir uma zona API SERP ativa, você está pronto para começar. Basta copiar o nome da zona (serp_api, neste caso), pois você precisará dele mais tarde.

Se não houver nenhuma zona, role para baixo até a seção “Soluções de Scraping” e clique no botão “Criar Zona” no cartão “API SERP”:

Creating a new “SERP API” zone

Dê um nome à sua zona (por exemplo, API SERP) e pressione “Adicionar”:

Clicking the “Add” button

Em seguida, vá para a página do produto da Zona e certifique-se de que ela esteja ativada, alternando o botão para “Ativo”:

Making sure the zone is enabled

Ótimo! Você configurou com sucesso a API SERP da Bright Data.

Etapa 2: Recupere sua chave API da Bright Data

A maneira recomendada de autenticar solicitações da API SERP é usando sua chave API da Bright Data. Se você ainda não gerou uma, siga o guia oficial para obter a sua.

Ao fazer uma solicitação POST para a API SERP, inclua a chave da API no cabeçalho de autorização desta forma para autenticação:

"Autorização: Portador <BRIGHT_DATA_API_KEY>"

Ótimo! Agora você tem todos os elementos necessários para chamar a API SERP da Bright Data em um script Python (ou através de qualquer outro cliente HTTP).

Etapa 3: Chame a API SERP

Junte tudo e chame a API SERP da Bright Data na página de pesquisa “agentic rag” do DuckDuckGo com este trecho de Python:

# pip install requests
import requests

# Credenciais da Bright Data (TODO: substitua pelos seus valores) 
bright_data_api_key = "<YOUR_BRIGHT_DATA_API_KEY>"
bright_data_serp_api_zone_name = "<YOUR_SERP_API_ZONE_NAME>"

# Sua página de pesquisa DuckDuckGo alvo
duckduckgo_page_url = "https://duckduckgo.com/?q=agentic+rag"

# Realizar uma solicitação à API SERP da Bright Data
response = requests.post(
    "https://api.brightdata.com/request",
    headers={
        "Authorization": f"Bearer {bright_data_api_key}",
        "Content-Type": "application/json"
    },
    json={
        "zona": bright_data_serp_api_zona_name,
        "url": duckduckgo_page_url,
        "format": "raw"
    })


# Acesse o HTML renderizado da versão dinâmica do DuckDuckGo
html = response.text
# Lógica de Parsing...

Para um exemplo mais completo, confira o “Projeto Python da API SERP da Bright Data” no GitHub.

Observe que, desta vez, a URL de destino pode ser a versão dinâmica do DuckDuckGo (por exemplo, https://duckduckgo.com/?q=agentic+rag). A API SERP lida com a renderização JavaScript, integra-se à rede de proxy Bright Data para rotação de IP e gerencia outras medidas anti-scraping, como impressão digital do navegador e CAPTCHAs. Portanto, não haverá problemas ao fazer scraping de SERPs dinâmicas.

A variável html conterá o HTML totalmente renderizado da página DuckDuckGo. Verifique isso imprimindo o HTML com:

print(html)

Você obterá algo como isto:

<!DOCTYPE html>
<html lang="en-US">
  <head>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Agentic RAG no DuckDuckGo</title>
      <!-- Omitido por brevidade ... -->
  </head>
  <body>
      <div class="site-wrapper" style="min-height: 825px;">
          <div id="content">
              <div id="duckassist-answer" class="answer-container">
                  <DIV class="answer-content-block">
                      <P class="answer-text">
                          <SPAN class="highlight">O Agentic RAG</SPAN> é uma versão avançada do Retrieval-Augmented Generation (RAG) que permite que os agentes de IA gerenciem dinamicamente como recuperam e usam informações, melhorando sua capacidade de responder a consultas em tempo real e se adaptar a situações em constante mudança. Essa abordagem aumenta a precisão e a capacidade de tomada de decisão dos sistemas de IA, integrando o raciocínio à recuperação de dados.
</P>
<!-- Omitido por brevidade ... -->
</DIV>
<!-- Omitido por brevidade ... -->
</DIV>

              <ul class="results-list">
                  <li class="result-item">
                      <article class="result-card">
                          <div <!-- Omitido por motivos de concisão ... -->

                          <div class="result-body">
                              <h2 class="result-title">
                                  <a href="https://www.geeksforgeeks.org/artificial-intelligence/what-is-agentic-rag/" rel="noopener" target="_blank" class="result-link">
                                      <span class="title-text">O que é Agentic RAG? - GeeksforGeeks</span>
                                  </a>
                              </h2>
                              <div class="result-snippet-container">
                                  <div class="result-snippet">
                                      <div>
                                          <span class="snippet-text">
                                              <span class="snippet-date">8 de setembro de 2026</span>
                                              <span>
                                                  <b>A arquitetura Agentic RAG</b> foi projetada para maximizar a adaptabilidade e a inteligência, aproveitando agentes autônomos e integrações de ferramentas especializadas. Em sua essência, a arquitetura organiza agentes de raciocínio, cada um capaz de tomar decisões, planejar e recuperar informações, em um sistema coordenado. Vejamos os principais componentes da arquitetura <b>Agentic RAG</b>, 1.
                                              </span>
                                          </span>
                                      </div>
                                  </div>
                              </div>
                          </div>
                      </article>
                  </li>
                  <!-- Outros resultados de pesquisa ... -->
              </ul>
              <!-- Omitido por brevidade ... -->
          </div>
          <!-- Omitido por brevidade ... -->
      </div>
  </body>
</html>

Observação: o HTML de saída também pode incluir o resumo gerado pela IA “Search Assist”, já que você está lidando com a versão dinâmica da página.

Agora, analise este HTML conforme mostrado na primeira abordagem para acessar os dados do DuckDuckGo de que você precisa!

Abordagem nº 4: Integrando uma ferramenta de scraping do DuckDuckGo em um agente de IA via MCP

Lembre-se de que o produto API SERP também é exposto por meio da ferramenta search_engine disponível no Bright Data Web MCP.

Esse servidor MCP de código aberto fornece acesso de IA às soluções de recuperação de dados da web da Bright Data, incluindo recursos de scraping do DuckDuckGo. Mais especificamente, a ferramenta search_engine está disponível no nível gratuito do Web MCP para que você possa integrá-la aos seus agentes de IA ou fluxos de trabalho sem nenhum custo.

Para integrar o Web MCP à sua solução de IA, geralmente é necessário ter o Node.js instalado localmente e um arquivo de configuração como este:

{
  "mcpServers": {
    "Bright Data Web MCP": {
      "command": "npx",
      "args": ["-y", "@brightdata/mcp"],
      "env": {
        "API_TOKEN": "<YOUR_BRIGHT_DATA_API_KEY>"
      }
    }
  }
}

Por exemplo, essa configuração funciona com o Claude Code. Descubra outras integrações na documentação.

Graças a essa integração, você poderá recuperar dados SERP em linguagem natural e usá-los em seus fluxos de trabalho ou agentes alimentados por IA.

Conclusão

Neste tutorial, você viu os quatro métodos recomendados para fazer scraping no DuckDuckGo:

  1. Por meio de um Scraper personalizado
  2. Usando DDGS
  3. Com a API de pesquisa do DuckDuckGo
  4. Graças ao Web MCP

Como demonstrado, a única maneira confiável de fazer scraping do DuckDuckGo em grande escala, evitando bloqueios, é usando uma solução de scraping estruturada, apoiada por uma tecnologia robusta de bypass anti-bot e uma grande rede de Proxy, como a Bright Data.

Crie uma conta gratuita na Bright Data e comece a explorar nossas soluções de scraper!