
LinkedIn API로부터 회사 직원을 덤프/스크래핑/추출하는 Python 3 스크립트
LinkedInDumper는 LinkedIn 소셜 네트워킹 플랫폼에서 직원 데이터를 덤프하는 Python 3 스크립트입니다.
결과에는 이름, 성, 직위(직함), 위치 및 사용자의 프로필 링크가 포함됩니다. 회사 직원이 10명 이하인 경우 모든 직원을 검색하는 데 API 호출이 2번만 필요합니다. 그렇지 않으면 API 결과를 페이지 단위로 탐색해야 합니다. --email-format CLI 플래그를 사용하면 검색된 이름과 성을 기반으로 이메일 주소를 자동 생성하는 Python 문자열 형식을 정의할 수 있습니다.
LinkedInDumper는 인증이 필요한 비공식 LinkedIn Voyager API와 통신합니다. 따라서 유효한 LinkedIn 사용자 계정이 있어야 합니다. 간단하게 하기 위해, LinkedInDumper는 사용자가 제공하는 쿠키 값만 필요로 합니다. 이렇게 하면 2FA가 활성화된 계정도 지원됩니다. 또한 직원을 덤프할 LinkedIn 회사 URL을 제공해야 합니다.
li_at 세션 쿠키 값을 가져옵니다.li_at에 영구적으로 지정하거나, 런타임 중에 CLI 플래그 --cookie를 사용하여 임시로 지정합니다.usage: 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'
스크립트는 세미콜론으로 구분된 값(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 ^_-
선택적으로 --output-json 및 --output-csv CLI 매개변수를 사용하여 결과를 JSON 또는 CSV로 저장할 수 있습니다.
LinkedIn은 연락처 정보를 수집할 때 처음 1,000개의 검색 결과만 반환하도록 허용합니다. 또한 프리미엄 계정이 아닌 LinkedIn 계정으로 프로필 방문에 대한 최대 허용 쿼리 횟수에 도달하면 LinkedIn 프리미엄 계정이 필요할 수 있습니다.
또한 모든 직원 프로필이 공개된 것은 아닙니다. 결과는 사용 중인 LinkedIn 계정과 크롤링하려는 회사의 일부 직원과 친구 관계인지 여부에 따라 달라집니다. 따라서 일부 직원 계정의 이름, 성 및 프로필 URL을 검색하지 못하는 경우가 있습니다. 이러한 프로필은 이름에 "LinkedIn", 성에 "Member"와 같은 기본값을 포함하고 있기 때문에 스크립트가 표시하지 않습니다. 이러한 비공개 프로필을 포함하려면 CLI 플래그 --include-private-profiles를 사용하십시오. 일부 계정은 비공개일 수 있지만, 해당 계정의 직위(직함) 및 위치는 얻을 수 있습니다. 비공개 LinkedIn 계정의 경우 이름, 성 및 프로필 URL만 숨겨집니다.
마지막으로, LinkedIn 사용자는 자신의 프로필을 자유롭게 이름을 지정할 수 있습니다. 따라서 계정 이름은 인사말, 약어, 이모지, 중간 이름 등 다양한 내용으로 구성될 수 있습니다. 일부 말도 안 되는 부분을 제거하기 위해 최선을 다했지만, 이는 일반적인 문제에 대한 완전한 해결책은 아닙니다. 공식 LinkedIn API를 사용하지 않는다는 점에 유의하십시오. 이 스크립트는 "비공식" Voyager API에서 정보를 수집합니다.
실험적인 --include-contact-infos CLI 플래그를 사용하여 사용자의 연락처 정보(이름, 성, 주소, 전화번호, 이메일, 주소)에서 추가 세부 정보를 검색할 수 있습니다. 이는 열거된 각 LinkedIn 사용자 계정을 개별적으로 쿼리하고 GraphQL API를 사용하여 데이터를 가져옵니다. JSON 출력만 반환하며 요청이 매우 많습니다. 데이터 반환 여부는 사용자의 개인 정보 설정 및 열거에 사용된 LinkedIn 계정에 따라 달라집니다.
maximum request exceeded와 같은 오류 메시지가 표시되면 --jitter CLI 매개변수를 사용하여 자동화된 API 요청에 지연을 도입해 보십시오. 이는 LinkedIn의 구현된 감지 또는 속도 제한을 우회할 수 있습니다.