Anleitung zum Scrapen von LinkedIn-Daten mit Python

Bemerkungen: 0

Das Scraping von LinkedIn-Daten kann aus mehreren Gründen unglaublich wertvoll sein:

  • Stellenmarktanalyse: Analysieren Sie Trends in Stellenangeboten, z. B. die am meisten nachgefragten Fähigkeiten und Branchen;
  • Rekrutierung: Sammeln von Daten über Stellenausschreibungen, um Einstellungsstrategien zu entwickeln;
  • Mitbewerberforschung: Beobachtung der Einstellungsmuster und -strategien von Mitbewerbern.

In dem Artikel werden wichtige Techniken und Strategien hervorgehoben, einschließlich der Wichtigkeit, die Erkennung über Proxys und Header von vornherein zu vermeiden. Die requests-Bibliothek wird für die Durchführung von HTTP-Anfragen verwendet, während lxml zum Parsen von HTML-Inhalten eingesetzt wird.

Einrichten der Umgebung

Bevor Sie beginnen, stellen Sie sicher, dass Sie Python auf Ihrem Rechner installiert haben.

Installieren Sie die benötigten Bibliotheken mit pip:


pip install requests
pip install lxml

Einstieg in die Nutzung des Scrapers

Hier ist ein umfassendes Codebeispiel für das Scrapen von LinkedIn-Stellenangeboten mit Python:

Bibliotheken importieren

Wir werden mehrere Python-Bibliotheken benötigen:

  • Requests: Um HTTP-Anfragen zum Abrufen von Webseiten zu stellen.
  • lxml: Für das Parsen von HTML-Inhalten.
  • csv: Zum Schreiben der extrahierten Daten in eine CSV-Datei.

import requests
from lxml import html
import csv
import random

Die URL für die Stellensuche festlegen

Definieren Sie zunächst die LinkedIn-Jobsuche-URL, die Sie abrufen möchten.


url = 'https link'

Strings für Benutzer-Agenten und Proxys

Um LinkedIn effektiv zu scrapen, ist es wichtig, die richtigen Header zu verwenden, insbesondere den User-Agent-Header, um Anfragen von einem echten Browser zu imitieren.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

Moderne Proxy-Anbieter unterstützen häufig die interne Rotation, d. h. sie wechseln die IP-Adressen automatisch für Sie. Dadurch entfällt die Notwendigkeit, Proxys manuell aus einer Liste auszuwählen. Zur Veranschaulichung sehen Sie hier, wie1 Sie die Proxy-Rotation im Bedarfsfall handhaben würden:


proxies = {
    'http': random.choice(proxies),
    'https': random.choice(proxies)
}

Kopfzeilen für Anfragen

Erfolgreiches LinkedIn Scraping hängt von der korrekten Einrichtung von Headern ab, die das Verhalten eines echten Browsers nachahmen. Richtig konfigurierte Header helfen nicht nur bei der Umgehung von Anti-Bot-Schutzsystemen, sondern verringern auch die Wahrscheinlichkeit, dass Ihre Scraping-Aktivitäten blockiert werden.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Initialisierung der Datenspeicherung

Um Informationen zu Stellenausschreibungen effektiv zu sammeln und zu speichern, sollten Sie zunächst einen Datenspeicher initialisieren. In Python bedeutet dies in der Regel die Erstellung einer leeren Liste. Diese Liste dient als Speichercontainer, in den Sie die aus dem HTML-Inhalt extrahierten Jobdetails einfügen können. Diese Methode stellt sicher, dass die Informationen systematisch gesammelt werden und für die weitere Verarbeitung oder Analyse leicht zugänglich sind.

job_details = []

Parsing des HTML-Inhalts

Nach dem Senden einer HTTP-GET-Anfrage besteht der nächste Schritt darin, den HTML-Inhalt mithilfe der lxml-Bibliothek zu analysieren. Dadurch können wir durch die HTML-Struktur navigieren und die Daten identifizieren, die wir extrahieren wollen.


# Zufälliger User-Agent und Proxy mit IP-Autorisierungsmethode einstellen
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# Senden Sie eine HTTP-GET-Anfrage an die URL
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

Auslesen von Auftragsdaten

Sobald der HTML-Inhalt geparst ist, können wir mithilfe von XPath-Abfragen spezifische Jobdetails wie Titel, Firmenname, Standort und Job-URL extrahieren. Diese Details werden in einem Wörterbuch gespeichert und an eine Liste angehängt.


# Extrahieren von Auftragsdetails aus dem HTML-Inhalt
for job in parser.xpath('//ul[@class="jobs-search__results-list"]/li'):
    title = ''.join(job.xpath('.//div/a/span/text()')).strip()
    company = ''.join(job.xpath('.//div/div[2]/h4/a/text()')).strip()
    location = ''.join(job.xpath('.//div/div[2]/div/span/text()')).strip()
    job_url = job.xpath('.//div/a/@href')[0]
    
    job_detail = {
        'title': title,
        'company': company,
        'location': location,
        'job_url': job_url
    }
    job_details.append(job_detail)

Daten im CSV-Format speichern

Nachdem Sie die Auftragsdaten gesammelt haben, speichern Sie sie in einer CSV-Datei.


with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['title', 'company', 'location', 'job_url']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for job_detail in job_details:
        writer.writerow(job_detail)

Kompletter Code

Hier ist der vollständige Code, der alle oben genannten Abschnitte kombiniert:


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.by import By
import csv

# Geben Sie die Adresse des Proxyservers mit Benutzernamen und Passwort an
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Einrichten der Chrome-Optionen mit dem Proxy und der Authentifizierung
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Erstellen einer WebDriver-Instanz mit selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# Führen Sie Ihre Selenium-Automatisierung mit den erweiterten Möglichkeiten von selenium-wire durch
driver.get(url)

job_details = []

all_elements = driver.find_elements(By.XPATH,
                                   '//*[@id="main-content"]/section/ul/li')

for i in all_elements:
   title = i.find_element(By.XPATH,
                          './/div/div/h3').text
   company = i.find_element(By.XPATH, './/div/div[2]/h4/a').text
   location = i.find_element(By.XPATH, './/div/div[2]/div/span').text
   job_url = i.find_element(By.XPATH,
                            './/div/a').get_attribute('href')

   job_detail = {
       'title': title,
       'company': company,
       'location': location,
       'job_url': job_url
   }
   job_details.append(job_detail)

with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
   fieldnames = ['title', 'company', 'location', 'job_url']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for job_detail in job_details:
       writer.writerow(job_detail)

driver.quit()

Das Extrahieren von Daten aus LinkedIn unter Verwendung von Python mit den Bibliotheken requests und lxml bietet eine leistungsstarke Möglichkeit, den Stellenmarkt zu analysieren und Personal zu rekrutieren. Um einen reibungslosen Scraping-Prozess zu gewährleisten, werden Rechenzentrums-Proxys mit hohen Geschwindigkeiten sowie ISP-Proxys mit einem höheren Vertrauensfaktor verwendet, was das Risiko von Blockaden bei automatisierten Aktionen verringert.

Bemerkungen:

0 Bemerkungen