Du kan skrape LinkedIn-profiler i Python ved å sende kjente, offentlige profil-URL-er til Datablists LinkedIn Profile Scraper API med Requests-biblioteket. API-et returnerer strukturerte felt for identitet, sted, arbeidshistorikk, utdanning og selskap, slik at du kan bygge lead-lister og tilpasse outreach med relevant informasjon om rolle og selskap.

Denne guiden bruker den offentlige profil-URL-en til Satya Nadella som et kort eksempel. Du kjører en fullstendig profilskraping, tolker den returnerte Microsoft-rollen og de daterte arbeidserfaringene, og lagrer deretter resultatet sammen med det opprinnelige leadet før du forbereder outreach.

🔑 Kort oppsummert for deg som har det travelt: Send kjente URL-er til personprofiler på LinkedIn til Datablist, og hent tilgjengelige data om profil, sted, arbeidshistorikk, utdanning og selskap som strukturert JSON. Python-eksemplet nedenfor lagrer opplysningene sammen med hvert opprinnelige lead, slik at du kan kvalifisere listen og forberede mer relevant outreach.

  • Input: Kjente URL-er til personprofiler på LinkedIn.
  • Output: Strukturerte profildetaljer lagret sammen med hver kildekontakt.

💡 Foretrekker du en no-code-løsning? Bruk Datablists LinkedIn Profile Scraper for å hente detaljer fra kjente profil-URL-er uten å skrive kode.

Konfigurer Datablist API og Python-miljøet

Tilgang til Datablist REST API er inkludert i Growth-abonnementet. Profilhenting bruker også enrichment credits, som jeg går gjennom i delen om kostnader.

Opprett en Personal API Key på kontosiden for Datablist API. Dette eksemplet viser formatet til en Personal API Key:

text
auth0|exampleuser:exampleaccount:EXAMPLE_TOKEN_NOT_VALID:1

Skriptet leser nøkkelen fra miljøvariabelen DATABLIST_API_KEY og sender den i X-API-Key-headeren.

I dette Python-eksemplet bruker jeg pakken requests. Disse kommandoene er beregnet på et macOS- eller Linux-skall. Opprett en prosjektmappe, åpne den i terminalen og kjør:

shell
python -m venv .venv
source .venv/bin/activate
python -m pip install requests

Opprett deretter filen scrape_linkedin_profiles.py, og eksporter nøkkelen din:

shell
export DATABLIST_API_KEY="your-personal-api-key"

Skrap en komplett LinkedIn-profil med Python

Kildeposten i denne gjennomgangen inneholder en stabil kontakt-ID og én kjent profil-URL:

json
{
"contact_id": "contact-satya-nadella",
"profile_url": "https://www.linkedin.com/in/satyanadella/"
}

Skriptet sender contact_id som API-ets inputId. Resultatene kommer ikke nødvendigvis i samme rekkefølge som inputene, så denne ID-en gir deg en pålitelig måte å koble hvert resultat til riktig kildekontakt på.

Lim inn følgende komplette skript i scrape_linkedin_profiles.py:

python
import json
import os
import time
import uuid
import requests
def scrape_profiles(source_contacts, api_key):
"""Submit one task, wait for completion, and return every result page."""
tasks_url = "https://api.datablist.com/v1/enrichments/tasks"
headers = {"X-API-Key": api_key}
inputs = [
{
"inputId": contact["contact_id"],
"data": {"profileUrl": contact["profile_url"]},
}
for contact in source_contacts
]
unique_id = str(uuid.uuid4())
print(f"Task uniqueId: {unique_id}", flush=True)
payload = {
"enrichmentId": "linkedin-profile-scraper",
"uniqueId": unique_id,
"settings": {
"experiencesNb": "5",
"educationsNb": "3",
"acceptCachedProfiles": False,
"includeUrn": False,
"includePictures": False,
},
"inputs": inputs,
}
response = requests.post(tasks_url, headers=headers, json=payload)
response.raise_for_status()
task = response.json()
task_id = task["@id"]
task_url = f"{tasks_url}/{task_id}"
print(f"Task ID: {task_id}")
while task["status"] not in ("completed", "failed", "stopped"):
time.sleep(3)
response = requests.get(task_url, headers=headers)
response.raise_for_status()
task = response.json()
if task["status"] != "completed":
raise RuntimeError(
f"Task {task_id} {task['status']}: {task.get('error')}"
)
results = []
results_url = f"{task_url}/results"
params = {"limit": 100}
while True:
response = requests.get(results_url, headers=headers, params=params)
response.raise_for_status()
page = response.json()
results.extend(page["results"])
next_cursor = page["nextCursor"]
if next_cursor is None:
break
params["cursor"] = next_cursor
return results
if __name__ == "__main__":
api_key = os.environ.get("DATABLIST_API_KEY")
if not api_key:
raise RuntimeError("Set DATABLIST_API_KEY before running this script.")
source_contacts = [
{
"contact_id": "contact-satya-nadella",
"profile_url": "https://www.linkedin.com/in/satyanadella/",
}
]
profile_results = scrape_profiles(source_contacts, api_key)
print(json.dumps(profile_results, indent=2))

Kjør skriptet med:

shell
python scrape_linkedin_profiles.py

Innstillingene ber om fem arbeidserfaringer og tre utdanningsoppføringer. API-et forventer at antallet oppgis som tekststrenger. acceptCachedProfiles: false ber om en ny uthenting, mens alternativene for bilder og interne ID-er er slått av fordi denne arbeidsflyten bruker varige tekst- og URL-felt.

Bruk en vanlig, offentlig /in/-profil-URL eller en Sales Navigator lead-URL for hver input. Et personnavn, en søkeside på LinkedIn og en selskapsside viser til andre typer oppgaver og er ikke gyldige profilinput for denne scraperen. Hvis kildedataene inneholder Sales Navigator-lenker, kan den returnerte profileUrl være den normaliserte, offentlige profil-URL-en. For større lister bør hver inputId være unik og stabil, ikke avledet fra radnummeret.

Antallet historikkoppføringer styrer hvor mange flate, nummererte felt for arbeid og utdanning API-et kan returnere. Det endrer ikke credit-prisen per profil. Be om nok historikk til å ta researchbeslutningen din, men unngå å velge ti arbeidserfaringer hvis du bare skal undersøke de siste rollene.

Dette gjør de tre API-kallene

POST-forespørselen sender de valgte innstillingene og profilinputene. Datablist tar imot arbeidet som en bakgrunnsoppgave og returnerer oppgavens @id. Skriptet skriver ut både den genererte uniqueId-en og den returnerte oppgave-ID-en, slik at du har verdiene du trenger for å undersøke oppgaven senere.

Det første GET-kallet sjekker oppgavestatusen hvert tredje sekund. Python-klienten blokkerer mens den venter, men API-oppgaven fortsetter i bakgrunnen. Løkken stopper ved completed, failed eller stopped.

Det andre GET-kallet henter resultater i sider med opptil 100 poster. Når nextCursor inneholder en verdi, henter skriptet neste side. Det stopper når nextCursor er null.

Les profilresultatet og velg riktige innstillinger

URL-en du sender inn, avgjør hvilken profil scraperen henter. Datablist godtar offentlige URL-er til personprofiler og Sales Navigator lead-URL-er, normaliserer profil-URL-en ved behov og fordeler tilgjengelige offentlige data på flate felt for profil, arbeid, utdanning og selskap.

Det nye oppslaget i denne guiden ble fullført uten feil og brukte 25 credits. Her er hele resultatet:

json
{
"inputId": "contact-satya-nadella",
"status": "success",
"outputs": {
"profileUrl": "https://www.linkedin.com/in/satyanadella/",
"fullName": "Satya Nadella",
"firstName": "Satya",
"lastName": "Nadella",
"linkedInHeadline": "Chairman and CEO at Microsoft",
"linkedInSummary": "As chairman and CEO of Microsoft, I define my mission and that of my company as empowering every person and every organization on the planet to achieve more.",
"linkedInProfilePicture": "https://media.licdn.com/dms/image/v2/C5603AQHHUuOSlRVA1w/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1579726625483?e=1794441600&v=beta&t=I1sL---bTuvjxqb1vdbNsNy-fAsLCpBj3-WtJjOGbOc",
"linkedInInternalIdentifier": "ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ",
"linkedInLocation": "Redmond, Washington, United States",
"linkedInCity": "Redmond",
"linkedInState": "Washington",
"linkedInCountryName": "United States",
"linkedInCountryCode": "US",
"linkedInLanguages": "",
"linkedInConnections": 832,
"linkedInlastExpTitle": "Chairman and CEO",
"linkedInlastExpCompany": "Microsoft",
"linkedInlastExpEmploymentType": null,
"linkedInlastExpLocation": "Greater Seattle Area",
"linkedInlastExpStartsAt": "2014-02-01",
"linkedInlastExpEndsAt": null,
"linkedInlastExpDescription": null,
"linkedInlastExpCompanyWebsite": "https://news.microsoft.com/",
"linkedInlastExpCompanyPage": "https://www.linkedin.com/company/microsoft/",
"linkedInlastExpCompanyIndustry": "Software Development",
"linkedInlastExpCompanyRange": "10001+",
"linkedInlastExpCompanyDescription": "Every company has a mission. What's ours? To empower every person and every organization to achieve more. We believe technology can and should be a force for good and that meaningful innovation contributes to a brighter world in the future and today. Our culture doesn’t just encourage curiosity; it embraces it. Each day we make progress together by showing up as our authentic selves. We show up with a learn-it-all mentality. We show up cheering on others, knowing their success doesn't diminish our own. We show up every day open to learning our own biases, changing our behavior, and inviting in differences. Because impact matters. \n\nMicrosoft operates in 190 countries and is made up of approximately 228,000 passionate employees worldwide.",
"linkedInlastExpCompanyLogo": "https://media.licdn.com/dms/image/v2/D560BAQH32RJQCl3dDQ/company-logo_200_200/B56ZYQ0mrGGoAM-/0/1744038948046/microsoft_logo?e=1793836800&v=beta&t=4wXD40LQU4IfLY4DiEvT2bwvjUoPQPGgi5_T-vPsbQ8",
"linkedIn2ExpTitle": "Chairman",
"linkedIn2ExpCompanyName": "The Business Council U.S.",
"linkedIn2ExpEmploymentType": null,
"linkedIn2ExpStartsAt": "2021-01-01",
"linkedIn2ExpEndsAt": "2023-01-01",
"linkedIn2ExpDescription": null,
"linkedIn2ExpLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQGcnaZNpjMvrw/company-logo_200_200/company-logo_200_200/0/1630557702704/the_business_council_us_logo?e=1793836800&v=beta&t=Ejb0D8lV5sMTFwcz_-FKdfQvIvq-mKx_Nl8vRMib53k",
"linkedIn3ExpTitle": "Member Board Of Trustees",
"linkedIn3ExpCompanyName": "University of Chicago",
"linkedIn3ExpEmploymentType": null,
"linkedIn3ExpStartsAt": "2018-01-01",
"linkedIn3ExpEndsAt": null,
"linkedIn3ExpDescription": null,
"linkedIn3ExpLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQGDP-PXY3u8dw/company-logo_200_200/B4EaENqZTQGoAM-/0/1791230580227/uchicago_logo?e=1793836800&v=beta&t=NJGoETr0tY868Z2pvlyXeh939iXwW0WbSFwRctabEVU",
"linkedIn4ExpTitle": "Board Member",
"linkedIn4ExpCompanyName": "Starbucks",
"linkedIn4ExpEmploymentType": null,
"linkedIn4ExpStartsAt": "2017-01-01",
"linkedIn4ExpEndsAt": "2024-01-01",
"linkedIn4ExpDescription": null,
"linkedIn4ExpLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQEQxk9y2rk7Hw/company-logo_200_200/company-logo_200_200/0/1631316692275?e=1793836800&v=beta&t=NVjljhe0oI5KzvJHodAJjss5EdvxaOIzQQ2rAGyh_AQ",
"linkedIn5ExpTitle": "Board Member",
"linkedIn5ExpCompanyName": "Fred Hutch",
"linkedIn5ExpEmploymentType": null,
"linkedIn5ExpStartsAt": "2016-01-01",
"linkedIn5ExpEndsAt": "2022-01-01",
"linkedIn5ExpDescription": null,
"linkedIn5ExpLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQGF4eOou62nvQ/company-logo_200_200/company-logo_200_200/0/1664795263764/fredhutch_logo?e=1793836800&v=beta&t=dJWSO-KkuBPd6I6aRYBoIcQVzcSEmGLwqYy-VMFXJQc",
"linkedInlastEduSchool": "The University of Chicago Booth School of Business",
"linkedInlastEduDegree": null,
"linkedInlastEduField": null,
"linkedInlastEduStartsAt": "1994-01-01",
"linkedInlastEduEndsAt": "1996-01-01",
"linkedInlastEduPage": "https://www.linkedin.com/school/universityofchicagoboothschoolofbusiness/",
"linkedInlastEduLogo": "https://media.licdn.com/dms/image/v2/D560BAQFZO05jhYKSkw/company-logo_200_200/company-logo_200_200/0/1692627816910/universityofchicagoboothschoolofbusiness_logo?e=2147483647&v=beta&t=BTjFA4UVU5iKIIyicg8d44rhoiuMbetNDB97BmqpwhQ",
"linkedIn2EduSchool": "Manipal Institute of Technology",
"linkedIn2EduDegree": "Bachelor’s Degree",
"linkedIn2EduField": "Electrical Engineering",
"linkedIn2EduStartsAt": null,
"linkedIn2EduEndsAt": null,
"linkedIn2EduPage": "https://www.linkedin.com/school/manipal-institute-of-technology/",
"linkedIn2EduLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQHodG_7cUqs6w/company-logo_200_200/B4DZ8hC8AUJQAE-/0/1782965846314/manipal_institute_of_technology_logo?e=2147483647&v=beta&t=jqJK15_r7lxUNgWdbbzdMq47aLa_PqnkDYxg4Jun4Zo",
"linkedIn3EduSchool": "University of Wisconsin-Milwaukee",
"linkedIn3EduDegree": "Master’s Degree",
"linkedIn3EduField": "Computer Science",
"linkedIn3EduStartsAt": null,
"linkedIn3EduEndsAt": null,
"linkedIn3EduPage": "https://www.linkedin.com/school/uwmilwaukee/",
"linkedIn3EduLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQE47QlO_LG8SQ/company-logo_200_200/company-logo_200_200/0/1729615751602/uwmilwaukee_logo?e=2147483647&v=beta&t=l-w3ttd1mZRc-_j5aCPXEzNiYJzl1iJjMGw7q8B3eRI"
},
"creditsUsed": "25",
"error": null
}

Les stillingstittel, arbeidsgiver, startdato og sluttdato i sammenheng. Microsoft-oppføringen starter i februar 2014 og har ingen sluttdato. Oppføringen for The Business Council U.S. går fra 2021 til januar 2023. Datoene skiller en pågående oppføring fra en avsluttet og viser samtidig hvordan roller kan overlappe.

linkedInlastExpTitle og linkedInlastExpCompany inneholder den nåværende eller sist registrerte arbeidserfaringen. Den første tilordnede oppføringen kan inneholde mer detaljerte selskapsdata, som selskapsside, nettsted, bransje, beskrivelse og antall ansatte. Nummererte oppføringer legger til tidligere stillingstitler, arbeidsgivere og datoer. I dette svaret er det returnerte Microsoft-nettstedet https://news.microsoft.com/. URL-en gir lead-posten en nyttig selskapskilde ved siden av personens rollehistorikk.

Feltene linkedInlastEduSchool, linkedIn2EduSchool og linkedIn3EduSchool viser The University of Chicago Booth School of Business, Manipal Institute of Technology og University of Wisconsin-Milwaukee. Manipal-oppføringen inkluderer en bachelorgrad i elektroteknikk, mens Wisconsin-Milwaukee-oppføringen inkluderer en mastergrad i informatikk. Feltene for grad og fagområde er tomme for Chicago.

Bruk experiencesNb-verdiene "3", "5" eller "10" og educationsNb-verdiene "1", "3" eller "5" for å velge hvor mye historikk du trenger. Les feltene direkte fra outputs når de er relevante for researchen din. En tom valgfri verdi betyr ikke at hele resultatet har mislyktes.

Ny uthenting passer godt ved klargjøring av lead-lister når du vil hente tilgjengelige offentlige profildata på nytt. Cached mode kan returnere en tilgjengelig, lagret profil for færre credits og gå over til en ny uthenting hvis ingen cached profil finnes. Velg ut fra hvor ferske data du trenger, og hvilket credit-budsjett du har.

En kjent LinkedIn-profil-URL blir til en strukturert kontaktpost for research gjennom LinkedIn Profile Scraper API
En kjent LinkedIn-profil-URL blir til en strukturert kontaktpost for research gjennom LinkedIn Profile Scraper API

Klargjør lead-poster for outreach

Når profile_results er tilgjengelig, kan du knytte hvert svar til den opprinnelige kontakten uten å sende inn en ny oppgave. Følgende kodeblokk gjenbruker variablene som ble opprettet av det komplette skriptet:

python
results_by_input_id = {
result["inputId"]: result
for result in profile_results
}
contact_research = []
for contact in source_contacts:
result = results_by_input_id[contact["contact_id"]]
contact_research.append(
{
"contact_id": contact["contact_id"],
"source_profile_url": contact["profile_url"],
"result_status": result["status"],
"profile": result.get("outputs", {}),
"credits_used": result["creditsUsed"],
"error": result.get("error"),
}
)
research_record = contact_research[0]
profile = research_record["profile"]
print("Contact:", profile.get("fullName"))
print("Headline:", profile.get("linkedInHeadline"))
print("Location:", profile.get("linkedInLocation"))
print(
"First work entry:",
profile.get("linkedInlastExpTitle"),
"at",
profile.get("linkedInlastExpCompany"),
)

Ordboken med inputId som nøkkel håndterer svar som kommer i en annen rekkefølge. contact-satya-nadella forblir både kilde-ID og API-ID, den kjente LinkedIn-URL-en forblir source_profile_url, og profile beholder det opprinnelige outputs-objektet uendret.

Denne wrapperen holder hele den returnerte profilen samlet med kilde-URL, API-status og credit-forbruk. Du kan bruke overskriften, stedet og den første arbeidserfaringen som skrives ut, til å kvalifisere leadet og legge til relevant kontekst om rolle eller selskap i outreach. API-rader som ikke lykkes, beholder returnert status og feilmelding, slik at de fortsatt er synlige i lead-listen.

Du kan laste ned det vedlikeholdte blokkerende Requests-eksemplet eller bruke det asynkrone HTTPX-alternativet når du har fått oversikt over den blokkerende flyten.

Beregn kostnaden for å skrape LinkedIn-profiler

En ny uthenting bruker 25 credits per profil. Når cached profiler er aktivert, bruker et tilgjengelig cached resultat 20 credits, mens et cache miss fortsatt kan gå over til en ny uthenting til 25 credits. Det nye Satya Nadella-eksemplet brukte 25 credits.

For 1 000 profiler bruker uthentingen dermed 20 000 credits hvis alle de forespurte cached profilene er tilgjengelige, eller opptil 25 000 credits ved ny uthenting. Tilgang til Datablist REST API krever Growth-abonnementet. Abonnementet, inkluderte credits og valgfrie credit top-ups er separate deler av kostnaden. Se prissiden for oppdaterte priser.

Med dagens grunnpris i USD på $20 for en top-up med 20 000 credits som planleggingseksempel, tilsvarer forbruket anslagsvis $20 for en kjøring av 1 000 profiler der alle finnes i cache, eller $25 for en ny uthenting. Disse anslagene kommer i tillegg til kostnaden for Growth-abonnementet.

Loading pricing…

Løs vanlige feil og gjenopprett en oppgave

  • DATABLIST_API_KEY mangler: Skriptet stopper før det sender en forespørsel. Eksporter variabelen, og kjør deretter filen på nytt.
  • API-et avviser nøkkelen: Kontroller Personal API Key, og send bare X-API-Key-legitimasjonen som brukes i dette eksemplet.
  • Profil-URL-en mangler eller er ugyldig: Bruk en offentlig LinkedIn-URL til en person eller en støttet Sales Navigator lead-URL. Et personnavn, en søkeside eller en selskapsside er ikke gyldig profilinput.
  • Du har ikke nok credits: Kontroller saldoen, og bruk deretter inkluderte credits eller legg til en top-up før du oppretter en ny oppgave.
  • Oppgaven har status failed eller stopped: Undersøk feilen, tilgjengelige resultater og credit-forbruket før du avgjør om du må sende inn en ny betalt oppgave.
  • Et resultat er mangelfullt eller har status no_result eller error: Undersøk statusen og den offentlige feilmeldingen, og bekreft deretter URL-en og innstillingene. Tilgjengelige felt kan variere avhengig av profilen, synligheten og uthentingen.

Hvis forbindelsen brytes under POST-kallet, bruker du uniqueId-en som ble skrevet ut før innsending. Hent listen over nylige scraper-oppgaver, og sammenlign verdiene før du oppretter en ny oppgave:

python
response = requests.get(
"https://api.datablist.com/v1/enrichments/tasks",
headers={"X-API-Key": api_key},
params={"enrichmentId": "linkedin-profile-scraper", "limit": 100},
)
response.raise_for_status()
printed_unique_id = "paste-the-printed-unique-id"
tasks = response.json()["tasks"]
matching_task = None
for task in tasks:
if task["uniqueId"] == printed_unique_id:
matching_task = task
break
if matching_task:
print("Task ID:", matching_task["@id"])

Oppgavelisten kan filtreres etter enrichmentId, men ikke etter uniqueId. Følg listens nextCursor hvis oppgaven ikke er på den første siden. Når du har oppgave-ID-en, fortsetter du med de samme URL-ene for status og resultater som hovedfunksjonen bruker. Dokumentasjonen for task API forklarer livssyklusen, pagineringen og hva som skjer ved avbrudd, mer detaljert.

Neste steg

Du har nå én gjenbrukbar Python Requests-funksjon som gjør kjente LinkedIn-profil-URL-er om til strukturerte resultater, i tillegg til lead-poster som kobles sammen med en stabil ID. Bytt ut eksemplet med et lite, kvalitetssikret sett med URL-er, velg ny eller cached uthenting ut fra ønsket aktualitet og credit-kostnad, og bruk den returnerte rolle- og selskapsinformasjonen til å kvalifisere leads eller tilpasse outreach.

Hvis du fortsatt må finne profil-URL-er ut fra navn og et søkeord for selskap eller skole, følger du den separate guiden for å finne LinkedIn-profiler i Python med et API før du kjører denne scraperen.