
Script de Python 3 para volcar/raspar/extraer empleados de una empresa desde la API de LinkedIn
LinkedInDumper es un script de Python 3 que vuelca datos de empleados desde la plataforma de redes sociales LinkedIn.
Los resultados incluyen nombre, apellido, cargo (puesto), ubicación y un enlace al perfil del usuario. Solo se requieren 2 llamadas a la API para recuperar todos los empleados si la empresa no tiene más de 10 empleados. De lo contrario, debemos paginar a través de los resultados de la API. Con el flag CLI --email-format se puede definir un formato de cadena Python para generar automáticamente direcciones de correo electrónico basadas en el nombre y apellido recuperados.
LinkedInDumper se comunica con la API no oficial de LinkedIn Voyager, que requiere autenticación. Por lo tanto, debes tener una cuenta de usuario válida de LinkedIn. Para simplificar, LinkedInDumper solo espera un valor de cookie proporcionado por ti. De esta manera, incluso las cuentas protegidas con 2FA son compatibles. Además, debes proporcionar una URL de empresa de LinkedIn para volcar empleados.
li_at, por ejemplo, a través de las herramientas de desarrolladorli_at del script Python o temporalmente durante la ejecución mediante el flag 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'
# install dependencies
pip install -r requirements.txt
python3 linkedindumper.py --url 'https://www.linkedin.com/company/apple' --cookie '<cookie>' --email-format '{0}.{1}@apple.de'
El script devolverá los datos de los empleados como valores separados por punto y coma (como CSV):
██▓ ██▓ ███▄ █ ██ ▄█▀▓█████ ▓█████▄ ██▓ ███▄ █ ▓█████▄ █ ██ ███▄ ▄███▓ ██▓███ ▓█████ ██▀███
▓██▒ ▓██▒ ██ ▀█ █ ██▄█▒ ▓█ ▀ ▒██▀ ██▌▓██▒ ██ ▀█ █ ▒██▀ ██▌ ██ ▓██▒▓██▒▀█▀ ██▒▓██░ ██▒▓█ ▀ ▓██ ▒ ██▒
▒██░ ▒██▒▓██ ▀█ ██▒▓███▄░ ▒███ ░██ █▌▒██▒▓██ ▀█ ██▒░██ █▌▓██ ▒██░▓██ ▓██░▓██░ ██▓▒▒███ ▓██ ░▄█ ▒
▒██░ ░██░▓██▒ ▐▌██▒▓██ █▄ ▒▓█ ▄ ░▓█▄ ▌░██░▓██▒ ▐▌██▒░▓█▄ ▌▓▓█ ░██░▒██ ▒██ ▒██▄█▓▒ ▒▒▓█ ▄ ▒██▀▀█▄
░██████▒░██░▒██░ ▓██░▒██▒ █▄░▒████▒░▒████▓ ░██░▒██░ ▓██░░▒████▓ ▒▒█████▓ ▒██▒ ░██▒▒██▒ ░ ░░▒████▒░██▓ ▒██▒
░ ▒░▓ ░░▓ ░ ▒░ ▒ ▒ ▒ ▒▒ ▓▒░░ ▒░ ░ ▒▒▓ ▒ ░▓ ░ ▒░ ▒ ▒ ▒▒▓ ▒ ░▒▓▒ ▒ ▒ ░ ▒░ ░ ░▒▓▒░ ░ ░░░ ▒░ ░░ ▒▓ ░▒▓░
░ ░ ▒ ░ ▒ ░░ ░░ ░ ▒░░ ░▒ ▒░ ░ ░ ░ ░ ▒ ▒ ▒ ░░ ░░ ░ ▒░ ░ ▒ ▒ ░░▒░ ░ ░ ░ ░ ░░▒ ░ ░ ░ ░ ░▒ ░ ▒░
░ ░ ▒ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░░░ ░ ░ ░ ░ ░░ ░ ░░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░ ░ ░ by LRVT
[i] Company Name: apple
[i] Company X-ID: 162479
[i] LN Employees: 1000 employees found
[i] Dumping Date: 17/10/2022 13:55:06
[i] Email Format: {0}.{1}@apple.de
Firstname;Lastname;Email;Position;Gender;Location;Profile
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] Successfully crawled 2 unique apple employee(s). Hurray ^_-
Opcionalmente, puedes usar los parámetros CLI --output-json y --output-csv para guardar los resultados en formato JSON o CSV.
LinkedIn solo permitirá que se devuelvan los primeros 1,000 resultados de búsqueda al recolectar información de contacto. Es posible que también necesites una cuenta premium de LinkedIn cuando hayas alcanzado el máximo de consultas permitidas para visitar perfiles con tu cuenta gratuita de LinkedIn.
Además, no todos los perfiles de empleados son públicos. Los resultados varían según la cuenta de LinkedIn que utilices y si tienes amistad con algunos empleados de la empresa a rastrear o no. Por lo tanto, a veces no es posible recuperar el nombre, apellido y URL del perfil de algunas cuentas de empleados. El script no mostrará dichos perfiles, ya que contienen valores predeterminados como "LinkedIn" como nombre y "Member" como apellido. Si deseas incluir dichos perfiles privados, utiliza el flag CLI --include-private-profiles. Aunque algunas cuentas pueden ser privadas, podemos obtener el cargo (puesto) así como la ubicación de dichas cuentas. Solo el nombre, apellido y URL del perfil están ocultos para las cuentas privadas de LinkedIn.
Finalmente, los usuarios de LinkedIn son libres de nombrar su perfil. Por lo tanto, un nombre de cuenta puede consistir en varias cosas como saludos, abreviaturas, emojis, segundos nombres, etc. Hice todo lo posible para eliminar algunos sinsentidos. Sin embargo, esto no es una solución completa al problema general. Ten en cuenta que no estamos utilizando la API oficial de LinkedIn. Este script recopila información de la API "no oficial" Voyager.
Puedes usar el flag CLI experimental --include-contact-infos para recuperar detalles adicionales de la información de contacto de un usuario (nombre, apellido, dirección, teléfono, correo electrónico, dirección). Esto consultará cada cuenta de usuario de LinkedIn enumerada individualmente y obtendrá los datos mediante la API GraphQL. Solo devuelve salida JSON y consume muchas solicitudes. Que se devuelvan datos depende de la configuración de privacidad del usuario y de la cuenta de LinkedIn que utilices para la enumeración.
Si percibes un mensaje de error como maximum request exceeded, prueba el parámetro CLI --jitter para introducir algunos retrasos en las solicitudes automatizadas a la API. Esto puede ser capaz de eludir las detecciones implementadas o la limitación de velocidad por parte de LinkedIn.