Voltar ao blogue
Guias
Suciu DanLast updated on May 13, 202614 min read

Como fazer scraping do LinkedIn em 2026: um guia Python

Como fazer scraping do LinkedIn em 2026: um guia Python
Resumo: Fazer scraping no LinkedIn implica contornar uma barreira de autenticação agressiva, o rastreio comportamental e a identificação por impressão digital TLS. Este guia apresenta uma árvore de decisão com métodos por tipo de página, padrões de Python funcionais para ofertas de emprego, perfis e empresas (API oculta, JSON-LD, Selenium quando necessário) e uma lista de verificação anti-bloqueio consolidada para 2026.

Se já tentou descobrir como fazer scraping no LinkedIn, provavelmente deparou-se com o mesmo obstáculo que todos nós: um pedido de início de sessão agressivo que surge após apenas algumas visualizações de página, seguido de respostas 999 silenciosas e, por fim, nada de útil. O scraping do LinkedIn consiste na prática de extrair dados públicos (perfis, empresas, ofertas de emprego e resultados de pesquisa) diretamente através de clientes HTTP, navegadores headless ou APIs ocultas, sem iniciar sessão numa conta pessoal. É tecnicamente mais difícil do que fazer scraping num site típico de comércio eletrónico, mas está longe de ser impossível.

Este guia é um passo a passo centrado no código para programadores, engenheiros de dados e equipas de growth ops que precisam de dados públicos do LinkedIn sem queimar contas ou rodar proxies às cegas. Começaremos com o que é realisticamente possível extrair, analisaremos como o LinkedIn deteta scrapers e percorreremos três métodos Python (uma API oculta de ofertas de emprego, análise de JSON-LD e um recurso de browser sem interface gráfica) com uma árvore de decisão para que escolha o caminho mais económico e fiável para cada tipo de página. A camada anti-bloqueio e o contexto legal vêm no final, porque se aplicam independentemente do método que escolher.

Que dados do LinkedIn pode realisticamente extrair

Antes de abordarmos como fazer scraping no LinkedIn, é útil ser honesto sobre o que é acessível a partir do exterior da barreira de autenticação. Quatro tipos de páginas são utilizáveis sem login: páginas de perfil público, páginas de empresas públicas, anúncios de emprego individuais e a /jobs/search página de resultados. Tudo o resto (Sales Navigator, o índice de pesquisa de pessoas, gráficos de mensagens, a lista completa de funcionários numa página de empresa) fica atrás da autenticação e de uma linha de Termos de Serviço que este guia não irá ultrapassar.

Dentro dessa área pública, ainda existe valor real. Obtém os campos principais de que a maioria das equipas necessita para informações de recrutamento, prospeção de vendas e pesquisa do mercado de trabalho, desde que aceite que a profundidade é limitada e que poderá ter de combinar fontes para preencher lacunas.

Campos públicos do LinkedIn por tipo de página

A tabela abaixo mapeia cada tipo de página pública para os seus campos extraíveis e caso de uso. Muitos pedidos do tipo «queremos extrair dados do LinkedIn» desaparecem assim que uma parte interessada vê o que está disponível sem ter de iniciar sessão.

Tipo de página

Campos públicos (típicos)

Útil para

Perfil (/in/...)

Nome, cargo, título, localização, resumo, URL do perfil, empregador

Prospecção de vendas, listas de pré-seleção de recrutadores

Empresa (/company/...)

Nome, setor, sede, seguidores, site, número de vagas em aberto

Pesquisa de contas, criação de ICP

Anúncio de emprego (/jobs/view/...)

Título, empresa, localização, data de publicação, descrição, nível de senioridade

Análise do mercado de trabalho, agregação de ofertas de emprego

Pesquisa de vagas (/jobs/search?...)

Lista de anúncios e metadados de paginação

Recolha em massa de ofertas de emprego em grande escala

Se um campo não estiver nessa tabela, presuma que a barreira de autenticação está no caminho. Uma visão geral separada dos dados de empregos é uma leitura complementar razoável.

Como o LinkedIn deteta e bloqueia os scrapers

Qualquer pessoa que aprenda a fazer scraping no LinkedIn descobre rapidamente que as defesas são em camadas, não selecionadas a partir de um menu. Existem três camadas a funcionar em paralelo, e todas alimentam um sinal interno: uma pontuação de fraude por visitante que decide se o seu pedido é aprovado, bloqueado temporariamente por trás de um pedido de início de sessão ou rejeitado por completo.

A primeira camada é a barreira de autenticação. Os visitantes anónimos são normalmente obrigados a iniciar sessão após apenas três a cinco visualizações de perfil, o que significa que qualquer scraper que solicite dezenas de perfis a partir da mesma identidade é eliminado logo na primeira tentativa. A segunda camada é o rastreio comportamental. O LinkedIn observa o tempo das solicitações, o fluxo de navegação, a atividade do rato e os padrões de referência. Um ser humano não carrega 100 perfis por minuto; um scraper sem restrições o fará, e esse único sinal é suficiente para sinalizar a sessão. A terceira camada é a impressão digital da solicitação. O LinkedIn inspeciona a qualidade do IP (residencial versus centro de dados), o hash JA3 do seu handshake TLS, cabeçalhos e cookies, e atributos do dispositivo. Enviar um python-requests/2.x agente de utilizador a partir de um IP da AWS resulta numa pontuação fraca nas três camadas de uma só vez.

Trate estas camadas como cumulativas, não alternativas. Limpar uma delas enquanto ignora as outras raramente altera a sua pontuação de fraude o suficiente para fazer diferença. Vale a pena marcar como favorito um guia básico sobre como evitar bloqueios de scrapers antes de expandir.

Escolher como fazer scraping no LinkedIn: uma árvore de decisão de métodos

Ao decidir como fazer scraping no LinkedIn, opte por padrão pela ferramenta mais leve que retorne os dados de que precisa. O LinkedIn foi construído como uma aplicação de página única, por isso os seus dados fluem através de três mecanismos, e cada um corresponde ao seu próprio método de scraping ideal.

  1. HTML renderizado pelo servidor. Algumas páginas devolvem dados suficientes na resposta HTML inicial para serem analisados com o Requests e o BeautifulSoup. É raro no LinkedIn atualmente, mas ainda se aplica a algumas subpáginas de empresas e páginas de entidades.
  2. JSON hidratado em <script> tags. As páginas de perfil público e de empresa incorporam um <script type="application/ld+json"> bloco que espelha os campos que a página visível renderiza. Analisar isto é mais rápido, mais barato e muito menos frágil do que perseguir seletores CSS através do DOM.
  3. XHR / APIs ocultas. As experiências de rolagem infinita (feed de empregos, lista de empregos da empresa, pesquisa) chamam pontos finais internos com parâmetros de consulta previsíveis. Reproduzir essas chamadas contorna totalmente a renderização.

A regra geral: experimente primeiro o JSON-LD para páginas de perfil e de empresa, repita a API oculta para empregos e pesquisa, e recorra a um navegador headless apenas quando ambos falharem. A maioria das equipas que tentam descobrir como fazer scraping do LinkedIn em grande escala gasta demasiado com o Selenium em tarefas que um script Requests de trinta linhas consegue concluir.

Método 1: Como extrair dados de empregos do LinkedIn através da API oculta Jobs-Guest

O endpoint de pesquisa de empregos é a superfície mais fácil do LinkedIn para extrair: é intencionalmente exposto a visitantes não autenticados e paginado por um único start . No momento da redação deste artigo, o caminho é /jobs-guest/jobs/api/seeMoreJobPostings/search, e a resposta devolve fichas de emprego em HTML em vez de JSON. O LinkedIn alterna os endpoints internos, por isso reconfirme o caminho no DevTools antes de uma execução em produção.

Um padrão mínimo em Python, analisado com o BeautifulSoup, tem o seguinte aspeto:

import requests
from bs4 import BeautifulSoup

BASE = "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search"
HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def fetch_page(keywords, location, start=0):
    params = {"keywords": keywords, "location": location, "start": start}
    r = requests.get(BASE, params=params, headers=HEADERS, timeout=20)
    r.raise_for_status()
    return r.text

def parse_cards(html):
    soup = BeautifulSoup(html, "html.parser")
    for card in soup.select("li"):
        title = card.select_one(".base-search-card__title")
        company = card.select_one(".base-search-card__subtitle")
        loc = card.select_one(".job-search-card__location")
        link = card.select_one("a.base-card__full-link")
        if title and link:
            yield {
                "title": title.get_text(strip=True),
                "company": company.get_text(strip=True) if company else None,
                "location": loc.get_text(strip=True) if loc else None,
                "url": link["href"].split("?")[0],
            }

jobs, start = [], 0
while True:
    html = fetch_page("python developer", "Berlin", start)
    batch = list(parse_cards(html))
    if not batch:
        break
    jobs.extend(batch)
    start += 25

O tamanho da página é de vinte e cinco cartões. A condição de paragem é um conjunto de resultados vazio, não uma contagem fixa de páginas, porque o LinkedIn filtra os resultados por localização geográfica e atualidade. Canalize jobs para o csv ou num quadro Pandas e terá um feed de empregos do LinkedIn sem precisar de usar um navegador. Um tutorial do BeautifulSoup aborda os padrões de seleção, caso precise de uma revisão.

Método 2: Como extrair perfis e empresas do LinkedIn via JSON-LD

A estratégia para obter mais informações nas páginas de perfis e empresas é ignorar completamente os seletores CSS e analisar o <script type="application/ld+json"> bloco que o LinkedIn insere durante a renderização do lado do servidor. O JSON-LD é estruturado, estável e muda com muito menos frequência do que o DOM visível. Para encontrá-lo em qualquer URL pública do LinkedIn, abra o DevTools e procure //script[@type='application/ld+json'] no painel Elementos.

import json
import requests
from bs4 import BeautifulSoup

HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def scrape_ld(url):
    r = requests.get(url, headers=HEADERS, timeout=20)
    r.raise_for_status()
    soup = BeautifulSoup(r.text, "html.parser")
    blob = soup.find("script", {"type": "application/ld+json"})
    if not blob:
        return None
    return json.loads(blob.string)

# Public profile
profile = scrape_ld("https://www.linkedin.com/in/some-public-handle/")
# Public company
company = scrape_ld("https://www.linkedin.com/company/openai/")

Para um perfil público, espere campos como name, jobTitle, worksFor, addresse, por vezes, alumniOf. Para uma empresa, espere name, description, url, numberOfEmployees, e um address bloco. Tudo o que o LinkedIn oculta atrás de um login (lista completa de funcionários, conexões mútuas, informações de contato) não estará presente no JSON-LD; isso não é um erro de análise, é a barreira de autenticação.

Recorra à análise de HTML apenas para campos que o JSON-LD não expõe, como o carrossel de «páginas semelhantes» nas páginas de empresas, e trate esses seletores como a parte mais frágil do seu pipeline. É também aí que se gasta a maior parte do tempo de manutenção, uma vez que o LinkedIn normalmente reestrutura a sua marcação front-end a cada duas a quatro semanas.

Método 3: Navegadores headless para pesquisa e secções carregadas de forma diferida

Recorra ao Selenium ou ao Playwright apenas quando os dois primeiros métodos não forem suficientes. Os casos mais comuns são os resultados de pesquisa de pessoas, o separador «Empregos nesta empresa» com carregamento diferido e qualquer página onde dados críticos apareçam após um evento de deslocamento. Se nunca criou nada semelhante antes, um manual introdutório sobre navegadores headless é um pré-requisito útil, e o tutorial do Selenium com Python explica a configuração do driver, caso seja necessário.

O fluxo de trabalho mínimo é o seguinte: inicie um driver Chromium, navegue com um agente de utilizador realista, aguarde que a rede estabilize, desça a página até que o bloco relevante tenha sido carregado e, em seguida, obtenha o DOM com um localizador Selenium ou passe driver.page_source para o BeautifulSoup. Não inicie sessão numa conta real do LinkedIn dentro do Selenium. Essa combinação viola os Termos de Serviço do LinkedIn e é a forma mais rápida de ter uma conta banida permanentemente.

Os navegadores headless não são, por si só, uma solução anti-bot. O Vanilla Puppeteer e o Playwright são fáceis de identificar ao nível do JA3 e navigator nível de objeto, pelo que ainda precisa dos controlos de proxy e de ritmo da secção seguinte. Se uma tarefa puder ser realizada sem um navegador, faça-a sem um navegador.

Lista de verificação anti-bloqueio: proxies, cabeçalhos, JA3 e ritmo

Quando as equipas que estão a descobrir como fazer scraping no LinkedIn mudam de um script pontual para um rastreamento recorrente, o modo de falha é quase sempre o anti-bot, não a análise. Siga esta lista por ordem.

  1. Use proxies residenciais, não de datacenter. O LinkedIn mantém uma lista rigorosa de ASNs de datacenters. Os pools residenciais alternam IPs reais de ISPs de consumidores e são muito mais difíceis de serem sinalizados. Um guia sobre como usar proxies com Python Requests é o melhor ponto de partida se você nunca configurou a rotação antes.
  2. Preste atenção à sua impressão digital JA3. O Plain requests tem uma impressão digital TLS que não corresponde a nenhum navegador real. Ferramentas que encapsulam curl_cffi ou reproduzem o hash JA3 de um navegador real passarão nesta verificação; o raw requests não passará.
  3. Envie um conjunto completo de cabeçalhos. No mínimo: um User-Agent, Accept, Accept-Language, Accept-Encodinge um Referer. A falta Accept-Language por si só é um forte indício de scraper.
  4. Controle o ritmo. Limite a simultaneidade, varie os atrasos entre um e cinco segundos e nunca faça picos.
  5. Alterne a identidade, não apenas o IP. Combine cada rotação de IP com um agente de utilizador e um conjunto de cookies novos, para que o LinkedIn não consiga ligar as sessões.

Se ainda assim for bloqueado após seguir esta lista, o problema é o volume, não a configuração. Abrande.

O caso mais notável nos EUA é o hiQ Labs v. LinkedIn, no qual os tribunais decidiram, em termos gerais, que a extração de dados do LinkedIn acessíveis ao público não constitui uma violação da Lei de Fraude e Abuso Informático. O litígio decorreu aproximadamente de 2017 a 2022 e terminou após a publicação dos pareceres do Nono Circuito; para o estado atual e o âmbito exato da decisão, a página do caso da EFF para hiQ v. LinkedIn é uma referência clara e de fácil compreensão. Há duas coisas que essa decisão não faz: não se sobrepõe aos Termos de Serviço do LinkedIn, que continuam a proibir o acesso automatizado enquanto se está conectado, e não se aplica fora da jurisdição dos EUA. Se estiver a fazer scraping em escala comercial, considere isto apenas como informação de base e consulte um advogado antes de avançar. Também vale a pena ler um guia geral sobre se o web scraping é legal.

Pontos-chave

  • Adapte o método ao tipo de página, não ao seu hábito. O JSON-LD é a melhor opção para páginas de perfil e de empresas, a API de empregos ocultos é a melhor para listas de empregos e pesquisa, e um navegador headless é o recurso alternativo, não o padrão.
  • Três camadas de defesa, uma pontuação de fraude. A barreira de autenticação, o rastreamento comportamental e a identificação de TLS/cabeçalho alimentam todos a mesma pontuação interna; limpar apenas um deles raramente altera o resultado.
  • Proxies residenciais e clientes HTTP compatíveis com JA3 são a base. IPs de centros de dados, por si só, não vão levar-te a um pipeline funcional no LinkedIn.
  • Nunca inicie sessão a partir de automação. Isso viola os Termos de Serviço e leva ao banimento permanente das contas, independentemente do cuidado que os seus seletores tenham.
  • Preveja falhas. O LinkedIn costuma reestruturar o seu front-end a cada duas semanas; crie seletores e analisadores JSON que possa trocar num único ficheiro.

Perguntas frequentes

Posso fazer scraping no LinkedIn sem iniciar sessão numa conta?

Sim, mas apenas a superfície pública. Páginas de perfil públicas, páginas de empresas, anúncios de emprego individuais e o /jobs/search ponto de acesso são acessíveis sem autenticação. O Sales Navigator, o índice de pesquisa de pessoas, os dados de conexões mútuas e a lista completa de funcionários numa página da empresa não o são. Os scrapers anónimos também recebem um pedido de login após cerca de três a cinco visualizações de perfil, por isso planeie a rotação de IP e identidade desde o primeiro dia.

Devo usar a API oficial do LinkedIn em vez de fazer scraping?

Provavelmente não para a recolha geral de dados. A API oficial do LinkedIn tem um âmbito muito restrito: foi concebida para integrações de parceiros, como candidaturas a empregos, partilha de publicações ou automação de marketing, e não fornece o tipo de dados de perfis públicos ou de empresas de que a maioria dos projetos de scraping necessita. A maioria das equipas que avalia a API oficial acaba por fazer scraping do site público para cobrir o que a API não fornece.

Que tipo de proxies funcionam melhor para o scraping do LinkedIn, residenciais ou de datacenter?

Residenciais, com rotação. O LinkedIn mantém listas de bloqueio agressivas de ASNs de centros de dados (AWS, GCP, OVH e similares), pelo que os IPs de centros de dados são limitados ou recebem uma resposta 999 muito rapidamente. Os conjuntos residenciais são encaminhados através de IPs reais de ISP de consumidores e parecem tráfego de utilizador comum. Para extrações pontuais de baixo volume, os proxies móveis também funcionam, mas são um exagero e mais caros para a maioria das tarefas.

Como posso saber se o meu scraper do LinkedIn está prestes a ser bloqueado?

Esteja atento a três sinais precoces. Primeiro, um aumento nos tempos de resposta (o LinkedIn costuma demorar um pouco antes de bloquear). Segundo, um aumento nas páginas que apresentam uma página intermédia de início de sessão em vez de conteúdo. Terceiro, respostas HTTP 999, que são o código específico do LinkedIn para indicar que «foi sinalizado». Se qualquer um destes três sinais apresentar uma tendência ascendente ao longo de uma hora, interrompa o rastreamento e alterne as identidades antes que a situação se agrave.

Com que frequência o LinkedIn altera a estrutura das suas páginas e desativa os scrapers?

Frequentemente. Os seletores HTML e CSS do front-end mudam normalmente a cada duas a quatro semanas, os pontos finais da API Voyager interna rodam aproximadamente a cada quatro a oito semanas e as estruturas JSON-LD tendem a permanecer estáveis durante vários meses. Baseie os seus scrapers em JSON-LD ou APIs ocultas sempre que possível, isole os seletores CSS frágeis num único módulo e reserve um orçamento para uma pequena ronda de manutenção mensal.

Conclusão

Descobrir como fazer scraping do LinkedIn em grande escala tem menos a ver com truques inteligentes e mais com disciplina. Escolha o método mais leve por tipo de página, respeite a barreira de autenticação e trate a camada anti-bot como uma prioridade de primeira ordem, em vez de uma preocupação secundária. O JSON-LD irá suportar a maior parte do seu trabalho com perfis e empresas. O endpoint jobs-guest irá suportar a maior parte do seu trabalho no mercado de trabalho. Reserve o Selenium para as superfícies genuinamente dinâmicas, nunca o execute com sessão iniciada e dedique o seu tempo de engenharia a proxies, controlo de ritmo e higiene JA3, em vez de a um script Selenium mais sofisticado.

A manutenção é a outra metade do trabalho. O LinkedIn reestrutura o seu frontend a um ritmo medido em semanas, por isso conceba analisadores que falhem de forma evidente, registe alterações estruturais e isole seletores para que uma correção seja uma alteração num único ficheiro, em vez de uma reescrita.

Se preferir ignorar completamente a camada de proxy, impressão digital e CAPTCHA e concentrar-se nos dados em si, a API Scraper da WebScrapingAPI trata do lado do pedido (rotação de IP, JA3, cabeçalhos, novas tentativas) por trás de um único ponto de extremidade e devolve HTML bruto que pode analisar com o mesmo código Requests-plus-BeautifulSoup que já escreveu acima. A lógica de scraping continua a ser sua; o desbloqueio é nosso.

Sobre o autor
Suciu Dan, Co-fundador @ WebScrapingAPI
Suciu DanCo-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

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.