
Script Python 3 para despejar/raspar/extrair funcionários de uma empresa da API do LinkedIn
O LinkedInDumper é um script Python 3 que extrai dados de funcionários da plataforma de rede social LinkedIn.
Os resultados contêm nome, sobrenome, cargo (título), localização e o link do perfil do usuário. Apenas 2 chamadas à API são necessárias para recuperar todos os funcionários se a empresa não tiver mais de 10 funcionários. Caso contrário, precisamos paginar pelos resultados da API. Com a flag de CLI --email-format pode-se definir um formato de string Python para gerar automaticamente endereços de e-mail com base no nome e sobrenome recuperados.
O LinkedInDumper se comunica com a API não oficial LinkedIn Voyager, que requer autenticação. Portanto, você deve ter uma conta de usuário válida do LinkedIn. Para simplificar, o LinkedInDumper espera apenas um valor de cookie fornecido por você. Dessa forma, até contas protegidas com 2FA são suportadas. Além disso, você deve fornecer uma URL de empresa do LinkedIn para extrair os funcionários.
li_at, por exemplo, através das ferramentas de desenvolvedorli_at do script Python ou temporariamente durante a execução via a flag de CLI --cookieusage: linkedindumper.py [-h] --url <linkedin-url> [--cookie <cookie>] [--quiet] [--include-private-profiles] [--include-contact-infos] [--jitter] [--email-format <mail-format>] [--output-json <json-file>] [--output-csv <csv-file>]
options:
-h, --help show this help message and exit
--url <linkedin-url> A LinkedIn company url - https://www.linkedin.com/company/<company>
--cookie <cookie> LinkedIn 'li_at' session cookie
--include-private-profiles
Show private accounts too
--include-contact-infos
Query each employee individually and retrieve contact infos
--jitter Add a random jitter to HTTP requests to bypass rate limiting
--email-format <mail-format>
Python string format for emails; for example:
--email-format '{0}.{1}@example.com' --> [email protected]
--email-format '{0[0]}.{1}@example.com' --> [email protected]
--email-format '{1}@example.com' --> [email protected]
--email-format '{0}@example.com' --> [email protected]
--email-format '{0[0]}{1[0]}@example.com' --> [email protected]
--output-json <json-file>
Store results in json output file
--output-csv <csv-file>
Store results in csv output file
docker run --rm l4rm4nd/linkedindumper:latest --url 'https://www.linkedin.com/company/apple' --cookie '<cookie>' --email-format '{0}.{1}@apple.de'
# instalar dependências
pip install -r requirements.txt
python3 linkedindumper.py --url 'https://www.linkedin.com/company/apple' --cookie '<cookie>' --email-format '{0}.{1}@apple.de'
O script retornará dados dos funcionários como valores separados por ponto e vírgula (como CSV):
██▓ ██▓ ███▄ █ ██ ▄█▀▓█████ ▓█████▄ ██▓ ███▄ █ ▓█████▄ █ ██ ███▄ ▄███▓ ██▓███ ▓█████ ██▀███
▓██▒ ▓██▒ ██ ▀█ █ ██▄█▒ ▓█ ▀ ▒██▀ ██▌▓██▒ ██ ▀█ █ ▒██▀ ██▌ ██ ▓██▒▓██▒▀█▀ ██▒▓██░ ██▒▓█ ▀ ▓██ ▒ ██▒
▒██░ ▒██▒▓██ ▀█ ██▒▓███▄░ ▒███ ░██ █▌▒██▒▓██ ▀█ ██▒░██ █▌▓██ ▒██░▓██ ▓██░▓██░ ██▓▒▒███ ▓██ ░▄█ ▒
▒██░ ░██░▓██▒ ▐▌██▒▓██ █▄ ▒▓█ ▄ ░▓█▄ ▌░██░▓██▒ ▐▌██▒░▓█▄ ▌▓▓█ ░██░▒██ ▒██ ▒██▄█▓▒ ▒▒▓█ ▄ ▒██▀▀█▄
░██████▒░██░▒██░ ▓██░▒██▒ █▄░▒████▒░▒████▓ ░██░▒██░ ▓██░░▒████▓ ▒▒█████▓ ▒██▒ ░██▒▒██▒ ░ ░░▒████▒░██▓ ▒██▒
░ ▒░▓ ░░▓ ░ ▒░ ▒ ▒ ▒ ▒▒ ▓▒░░ ▒░ ░ ▒▒▓ ▒ ░▓ ░ ▒░ ▒ ▒ ▒▒▓ ▒ ░▒▓▒ ▒ ▒ ░ ▒░ ░ ░▒▓▒░ ░ ░░░ ▒░ ░░ ▒▓ ░▒▓░
░ ░ ▒ ░ ▒ ░░ ░░ ░ ▒░░ ░▒ ▒░ ░ ░ ░ ░ ▒ ▒ ▒ ░░ ░░ ░ ▒░ ░ ▒ ▒ ░░▒░ ░ ░ ░ ░ ░░▒ ░ ░ ░ ░ ░▒ ░ ▒░
░ ░ ▒ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░░░ ░ ░ ░ ░ ░░ ░ ░░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ por LRVT
[i] Nome da Empresa: apple
[i] X-ID da Empresa: 162479
[i] Funcionários no LN: 1000 funcionários encontrados
[i] Data da Extração: 17/10/2022 13:55:06
[i] Formato de E-mail: {0}.{1}@apple.de
Nome;Sobrenome;E-mail;Cargo;Gênero;Localização;Perfil
Katrin;Honauer;[email protected];Software Engineer at Apple;N/A;Heidelberg;https://www.linkedin.com/in/katrin-honauer
Raymond;Chen;[email protected];Recruiting at Apple;N/A;Austin, Texas Metropolitan Area;https://www.linkedin.com/in/raytherecruiter
[i] Rastejados com sucesso 2 funcionário(s) único(s) da apple. Hurray ^_-
Opcionalmente, você pode usar os parâmetros de CLI --output-json e --output-csv para armazenar os resultados como JSON ou CSV.
O LinkedIn permitirá apenas os primeiros 1.000 resultados de pesquisa ao coletar informações de contato. Você também pode precisar de uma conta premium do LinkedIn quando atingir o número máximo de consultas permitidas para visitar perfis com sua conta gratuita.
Além disso, nem todos os perfis de funcionários são públicos. Os resultados variam dependendo da sua conta do LinkedIn usada e se você é amigo de alguns funcionários da empresa para rastrear ou não. Portanto, às vezes não é possível recuperar o nome, sobrenome e URL do perfil de algumas contas de funcionários. O script não exibirá esses perfis, pois eles contêm valores padrão como "LinkedIn" como nome e "Member" no sobrenome. Se você quiser incluir esses perfis privados, use a flag de CLI --include-private-profiles. Embora algumas contas possam ser privadas, podemos obter o cargo (título) e a localização dessas contas. Apenas nome, sobrenome e URL do perfil ficam ocultos para contas privadas do LinkedIn.
Por fim, os usuários do LinkedIn são livres para nomear seu perfil. Um nome de conta pode, portanto, consistir em várias coisas, como saudações, abreviações, emojis, nomes do meio etc. Tentei o meu melhor para remover alguns absurdos. No entanto, esta não é uma solução completa para o problema geral. Observe que não estamos usando a API oficial do LinkedIn. Este script coleta informações da API "não oficial" Voyager.
Você pode usar a flag experimental de CLI --include-contact-infos para recuperar detalhes adicionais das informações de contato de um usuário (nome, sobrenome, endereço, telefone, e-mail, endereço). Isso consultará cada conta de usuário do LinkedIn enumerada individualmente e buscará os dados usando a API GraphQL. Retorna apenas saída JSON e é muito intensivo em requisições. Se os dados são retornados ou não, depende da configuração de privacidade do usuário e da sua conta do LinkedIn usada para enumeração.
Se você perceber uma mensagem de erro como maximum request exceeded, tente o parâmetro de CLI --jitter para introduzir alguns atrasos nas requisições automatizadas da API. Isso pode ser capaz de contornar as detecções implementadas ou a limitação de taxa do LinkedIn.