Voltar ao blogue
A ciência da extração de dados da Web
Raluca PenciucLast updated on Mar 31, 20269 min read

Introdução aos cabeçalhos HTTP: Como utilizá-los para uma extração eficaz de dados da Web

Introdução aos cabeçalhos HTTP: Como utilizá-los para uma extração eficaz de dados da Web

A extração de dados da Web é uma ferramenta incrível para obter informações valiosas da Internet, mas sejamos realistas: pode ser bastante frustrante quando os nossos scripts de extração são bloqueados.

É como um jogo do gato e do rato, com os proprietários dos sites sempre a inventarem novas formas de o manter afastado. Mas há uma arma secreta na sua caixa de ferramentas que lhe pode dar vantagem: os cabeçalhos HTTP e os cookies.

Estes dois elementos desempenham um papel fundamental na forma como os seus scripts de scraping interagem com os sites, e dominá-los pode significar a diferença entre um scraping bloqueado e um bem-sucedido.

Neste tutorial, vamos desvendar os segredos dos cabeçalhos HTTP e dos cookies e mostrar-lhe como usá-los para tornar os seus esforços de scraping o mais semelhantes possíveis aos de um ser humano.

Vais aprender sobre os cabeçalhos mais comuns usados no web scraping, como capturar cabeçalhos e cookies de um navegador real e como usar cabeçalhos personalizados para contornar medidas de segurança. Então, vamos mergulhar no assunto e ver como podemos levar o nosso jogo de scraping para o próximo nível!

Compreender os cabeçalhos HTTP

Os cabeçalhos HTTP são pares chave-valor que envia como parte de um pedido ou resposta HTTP. Estão separados por dois pontos e um espaço e os seus nomes (chaves) não distinguem maiúsculas de minúsculas.

Pode agrupar os cabeçalhos HTTP em diferentes categorias, dependendo da sua função e da direção em que os envia. Estas categorias incluem:

  • cabeçalhos gerais: aplicam-se tanto a mensagens de pedido como de resposta
  • cabeçalhos de solicitação: contêm mais informações sobre o recurso que pretende obter ou sobre o cliente que está a fazer a solicitação
  • cabeçalhos de resposta: contêm informações adicionais sobre a resposta, tais como a sua localização ou o servidor que a fornece
  • cabeçalhos de entidade: contêm informações sobre o corpo do recurso, como o seu tamanho ou tipo MIME
  • cabeçalhos de extensão: utilizados para garantir a compatibilidade com versões anteriores

Os cabeçalhos HTTP fornecem uma ampla gama de informações, incluindo o tipo de pedido que está a fazer, o navegador que está a utilizar e quaisquer informações adicionais de que o servidor necessita para processar o pedido.

Também permitem fornecer informações de autenticação e segurança, controlar o cache e a compressão, e especificar o idioma e o conjunto de caracteres da solicitação.

Por exemplo, eis os cabeçalhos que o Chrome envia ao aceder ao youtube.com:

:authority: www.youtube.com

:method: GET

:path: /

:scheme: https

accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

accept-encoding: gzip, deflate, br

accept-language: en-US,en;q=0.9

cache-control: no-cache

pragma: no-cache

referer: https://www.google.com/

sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"

sec-ch-ua-arch: "x86"

sec-ch-ua-bitness: "64"

sec-ch-ua-full-version: "109.0.5414.75"

sec-ch-ua-full-version-list: "Not_A Brand";v="99.0.0.0", "Google Chrome";v="109.0.5414.75", "Chromium";v="109.0.5414.75"

sec-ch-ua-mobile: ?0

sec-ch-ua-model: ""

sec-ch-ua-platform: "Windows"

sec-ch-ua-platform-version: "15.0.0"

sec-ch-ua-wow64: ?0

sec-fetch-dest: document

sec-fetch-mode: navigate

sec-fetch-site: same-origin

sec-fetch-user: ?1

upgrade-insecure-requests: 1

user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

x-client-data: CIm2yQEIorbJAQjEtskBCKmdygEI5PDKAQiWocsBCKr2zAEI7oLNAQibiM0BCLqIzQEI9YjNAQ==

Decoded:

message ClientVariations {

  // Active client experiment variation IDs.

  repeated int32 variation_id = [3300105, 3300130, 3300164, 3313321, 3324004, 3330198, 3357482, 3359086, 3359771, 3359802, 3359861];

}

Compreender os cookies da Web

Os cookies da Web, ou cookies HTTP, são pequenos ficheiros de texto que um site armazena no navegador do utilizador. Depois disso, sempre que o utilizador envia uma nova solicitação ao site, os cookies são incluídos automaticamente.

São identificáveis de forma única e podem ser encontrados como:

  • cookies de sessão: são temporários e expiram quando o utilizador fecha o navegador
  • cookies persistentes: têm uma data de validade específica e permanecem no dispositivo do utilizador até expirarem ou serem eliminados pelo utilizador.

Os sites utilizam cookies para personalizar a experiência do utilizador. Isto pode incluir memorizar as suas informações de início de sessão e guardar o conteúdo do carrinho de compras, para compreender como os utilizadores interagem com o site e apresentar publicidade direcionada.

Tomando o youtube.com como exemplo também aqui, podemos ver o que os cookies armazenam:

cookie: CONSENT=YES+srp.gws-20210816-0-RC3.ro+FX+801; __Secure-3PAPISID=jG4abs_wYhyzcDG5/A2yfWlePlb1U9fglf; VISITOR_INFO1_LIVE=pJuwGIYiJlE; __Secure-3PSIDCC=AEf-XMRV_MjLL0AWdGWngxFHvNUF3OIpk3_jdeUwRiZ76WZ3XsSY0Vlsl1jM9n7FLprKTqFzvw; __Secure-3PSID=RAi8PYLbf3qLvF1oEav9BnHK_eOXwimNM-0xwTQPj1-QVG1Xwpz17T4d-EGzT6sVps1PjQ.; YSC=4M3JgZEwyiA; GPS=1; DEVICE_INFO=ChxOekU1TURJMk1URTBOemd5TWpJeU5qVTJOdz09EOvgo54GGOvgo54G; PREF=tz=Europe.Bucharest&f6=40000000&f4=4000000; CONSISTENCY=ACHmjUr7DnoYSMf5OL-vaunKYfoLGz1lWYRUZRepFyIBDRpp_jrEa85E4wgRJLJ2j15l688hk9IVQu7fIjYXo7sdsZamArxVHTMuChgHd22PkX_mbfifnMjyp4OX2swyQJRS-8PE6cOCt_6129fGyBs; amp_adc4c4=Ncu7lbhgeiAAYqecSmyAsS.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn4emd4v.1gn4en556.0.4.4

A importância dos cabeçalhos e dos cookies no web scraping

No web scraping, pode utilizar cabeçalhos e cookies para contornar medidas de segurança e aceder a conteúdos restritos, bem como para fornecer informações que possam ajudar a identificar o seu script de scraping como um navegador legítimo.

Por exemplo, ao especificar o cabeçalho User-Agent correto (mais detalhes na secção seguinte), pode fazer com que o seu script pareça ser um navegador Chrome, o que pode ajudá-lo a evitar a deteção pelo site.

Além disso, ao armazenar e enviar cookies, o seu scraper pode aceder a conteúdos que estão disponíveis apenas para utilizadores que iniciaram sessão. Como o site utiliza cookies para fornecer publicidade direcionada, também pode utilizá-los para extrair dados mais precisos e obter uma melhor compreensão do site.

Além de experimentar com cabeçalhos HTTP e cookies, considere algumas práticas recomendadas bastante úteis para web scraping listadas neste guia.

Cabeçalhos comuns utilizados na extração de dados da Web

Existem muitos cabeçalhos diferentes que podem ser utilizados na extração de dados da Web, mas alguns dos mais comuns são:

User-Agent

É utilizado para identificar o navegador e o sistema operativo que estão a ser utilizados pelo cliente que faz o pedido. Esta informação é utilizada pelos servidores para determinar qual o navegador e o sistema operativo que o cliente está a utilizar, de modo a fornecer o conteúdo e as funcionalidades adequadas.

A string User-Agent contém informações como o nome do navegador, a versão e a plataforma. Por exemplo, uma string User-Agent para o Google Chrome no Windows pode ter o seguinte aspeto:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

No web scraping, ao especificar um User-Agent que pertença a um navegador web comum, pode fazer com que o seu script pareça um navegador que é comumente utilizado por utilizadores legítimos, tornando-o assim menos suscetível de ser bloqueado.

Accept

É utilizado para especificar os tipos de conteúdo que o navegador está disposto a aceitar em resposta a um pedido HTTP, tais como texto, imagens, áudio ou vídeo. Um cabeçalho Accept pode ter o seguinte aspeto:

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

No web scraping, ao especificar o cabeçalho Accept correto, pode garantir que o seu script receba os dados corretos. Por exemplo, se quiser extrair uma página HTML, pode especificar o cabeçalho Accept como text/html.

No entanto, alguns sites podem utilizar este cabeçalho para detetar scrapers, pelo que é importante utilizá-lo com cuidado e apenas quando necessário.

Accept-Language

Este cabeçalho especifica o idioma preferido do conteúdo que o navegador está disposto a aceitar em resposta a uma solicitação HTTP. O cabeçalho Accept-Language é usado pelos servidores para determinar qual idioma enviar ao cliente.

Um navegador que solicite uma página HTML em inglês pode enviar um cabeçalho Accept-Language semelhante a este:

Accept-Language: en-US,en;q=0.9

Os sites utilizam este cabeçalho para enviar cookies a um cliente após a realização de um pedido. Um cabeçalho Cookie pode ter o seguinte aspeto:

Cookie: session_id=1234567890; user_id=johndoe

No web scraping, pode utilizar este cabeçalho para passar cookies de sessão e aceder a conteúdo que está disponível apenas para utilizadores que tenham iniciado sessão. Outro caso de utilização seria utilizar cookies persistentes para obter resultados personalizados.

Referer

Este cabeçalho especifica o URL da página web anterior a partir da qual foi seguido um link para a página atual. É utilizado pelos servidores para rastrear a origem da solicitação e compreender o contexto da mesma.

Por exemplo, se um utilizador clicar num link de uma página web para outra página web, o navegador envia um pedido para a segunda página web com o URL da primeira página web no cabeçalho Referer. Assim, o pedido para a segunda página web teria um cabeçalho Referer com o seguinte aspeto:

Referer: https://www.example.com/

Na extração de dados da Web, pode utilizar o cabeçalho Referer para aceder a sites que não permitem pedidos diretos.

Recuperar cabeçalhos e cookies de um navegador real

Mas chega de teoria. Vamos ver como pode extrair cabeçalhos HTTP e cookies da Web que são enviados para um site.

Voltando ao nosso exemplo, aceda a youtube.com no seu navegador real. Em seguida, clique com o botão direito do rato em qualquer ponto da página e selecione a opção «Inspecionar». Quando as Ferramentas do Desenvolvedor se abrirem, vá para o separador «Rede».

Depois de atualizar a página, deverá ver os pedidos a carregar em tempo real. Clique no primeiro (e principal) e aparecerá um separador adicional.

Aqui pode ver todos os detalhes da solicitação que enviou: URL, método, código de estado, endereço remoto e, mais importante ainda: os cabeçalhos de solicitação e resposta que estávamos à procura.

Utilizar cabeçalhos personalizados na extração de dados da Web

  • use httpbin.org para mostrar os cabeçalhos enviados por um navegador
  • escolha uma linguagem de programação e envie uma solicitação GET básica para ver os cabeçalhos
  • passe os cabeçalhos personalizados que capturou
  • repita o processo para node.js e python
  • reescreva a secção para o WSA - inclua um link para a documentação da API - descreva a funcionalidade dos cabeçalhos personalizados

Agora vamos ver como podemos utilizar estes cabeçalhos para melhorar os nossos scrapers. Para esta parte, vamos tomar como exemplo um site de espelhamento simples, que nos mostrará diretamente os cabeçalhos que enviamos: https://httpbin.org/headers.

Copie o conteúdo do objeto “headers” e vamos começar a escrever o código.

Node.js

Depois de se certificar de que o seu ambiente Node.js está configurado corretamente e o seu projeto inicializado, execute o seguinte código:

import got from 'got';

(async () => {

    const response = await got('https://httpbin.org/headers')

    console.log(response.body)

})()

Desta forma, podemos ver como se apresenta o pedido GET mais básico. O resultado deverá ser:

{

  "headers": {

    "Accept-Encoding": "gzip, deflate, br",

    "Host": "httpbin.org",

    "User-Agent": "got (https://github.com/sindresorhus/got)",

    "X-Amzn-Trace-Id": "Root=1-63c93ff5-0c352d6319620b3d6b46df02"

  }

}

Isto parece muito diferente do que vimos no nosso navegador. Só o User-Agent já torna muito fácil para um servidor detetar que a solicitação é automatizada.

Agora vamos passar os nossos cabeçalhos personalizados e enviar a solicitação novamente:

import got from 'got';

(async () => {

    const custom_headers = {

        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

    	  "Accept-Encoding": "gzip, deflate, br",

    	  "Accept-Language": "en-US,en;q=0.9",

    	  "Cache-Control": "no-cache",

    	  "Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

    	  "Host": "httpbin.org",

    	  "Pragma": "no-cache",

    	  "Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

    	  "Sec-Ch-Ua-Mobile": "?0",

    	  "Sec-Ch-Ua-Platform": "\"Windows\"",

    	  "Sec-Fetch-Dest": "document",

    	  "Sec-Fetch-Mode": "navigate",

    	  "Sec-Fetch-Site": "none",

    	  "Sec-Fetch-User": "?1",

    	  "Upgrade-Insecure-Requests": "1",

    	  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

    	  "X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

    }

    const response = await got('https://httpbin.org/headers', {

        headers: custom_headers

    })

    console.log(response.body)

})()

Ao executar o script novamente, deve notar que agora a nossa solicitação parece ter sido enviada a partir de um navegador Chrome real, mesmo que não tenhamos aberto um.

Python

Agora vamos tentar fazer o mesmo em Python. Embora a sintaxe e as bibliotecas sejam diferentes, o princípio é exatamente o mesmo.

import requests

url = 'https://httpbin.org/headers'

headers = {

	"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

	"Accept-Encoding": "gzip, deflate, br",

	"Accept-Language": "en-US,en;q=0.9",

	"Cache-Control": "no-cache",

	"Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

	"Host": "httpbin.org",

	"Pragma": "no-cache",

	"Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

	"Sec-Ch-Ua-Mobile": "?0",

	"Sec-Ch-Ua-Platform": "\"Windows\"",

	"Sec-Fetch-Dest": "document",

	"Sec-Fetch-Mode": "navigate",

	"Sec-Fetch-Site": "none",

	"Sec-Fetch-User": "?1",

	"Upgrade-Insecure-Requests": "1",

	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

	"X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

}

response = requests.get(url, headers=headers)

print(response.text)

O resultado após executar o script será o mesmo, independentemente da linguagem de programação que utilizar.

Cabeçalhos personalizados na WebScrapingAPI

Qualquer API de scraping que se preze deve fornecer a poderosa funcionalidade de passar cabeçalhos HTTP personalizados e cookies para uma solicitação. O padrão pode variar dependendo da API, por isso certifique-se de consultar sempre a documentação oficial primeiro.

Por predefinição, a WebScrapingAPI fornece um conjunto de cabeçalhos personalizados com cada pedido. Cabeçalhos User-Agent aleatórios seriam apenas um dos exemplos.

No entanto, como os sites podem tornar-se extremamente complexos ou simplesmente desatualizados, tem a liberdade de desativar este comportamento e personalizar totalmente a sua solicitação. Certifique-se apenas de obter uma chave de API primeiro e, em seguida, execute o seguinte código:

import got from 'got';

(async () => {

    const response = await got("https://api.webscrapingapi.com/v1", {

        searchParams: {

            api_key: "YOUR_API_KEY",

            url: "https://httpbin.org/headers",

            keep_headers: '0',

        },

        headers: {

            "Wsa-Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",

            "Wsa-Accept-Encoding": "gzip, deflate, br",

            "Wsa-Accept-Language": "en-US,en;q=0.9",

            "Wsa-Cache-Control": "no-cache",

            "Wsa-Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",

            "Wsa-Pragma": "no-cache",

            "Wsa-Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",

            "Wsa-Sec-Ch-Ua-Mobile": "?0",

            "Wsa-Sec-Ch-Ua-Platform": "\"Windows\"",

            "Wsa-Sec-Fetch-Dest": "document",

            "Wsa-Sec-Fetch-Mode": "navigate",

            "Wsa-Sec-Fetch-Site": "none",

            "Wsa-Sec-Fetch-User": "?1",

            "Wsa-Upgrade-Insecure-Requests": "1",

            "Wsa-User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",

            "Wsa-X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"

        }

    })

    console.log(response.body)

})()

Neste caso, de acordo com a documentação da API, temos de acrescentar o prefixo “Wsa-” ao nome de um cabeçalho para o passar para a solicitação. Esta medida foi implementada para evitar que cabeçalhos não intencionais sejam passados, como quando a solicitação da API é enviada a partir de um navegador.

Conclusão

Este artigo apresentou uma visão geral da importância e da utilização de cabeçalhos HTTP e cookies na extração de dados da Web.

Discutimos o que são cabeçalhos e cookies, como pode usá-los para aceder a conteúdo restrito e fazer com que o seu script de scraping pareça um navegador legítimo, bem como a forma como podem ser utilizados para rastreamento e análise.

Apresentámos também alguns dos cabeçalhos mais comuns utilizados no web scraping e explicámos como recuperar cabeçalhos e cookies de um navegador real. Em seguida, utilizámos exemplos de código para ilustrar como utilizá-los nos seus scripts de scraping.

Ao compreender e utilizar eficazmente cabeçalhos e cookies, pode melhorar a eficiência dos seus esforços de web scraping. Com este conhecimento, pode elevar as suas competências de scraping a um novo nível e extrair informações valiosas da web.

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.