Für Arbeitssuchende, Arbeitgeber oder andere Personen, die Trends auf dem Arbeitsmarkt beobachten, kann das Scraping der Liste der verfügbaren Stellen bei Indeed hilfreiche Informationen liefern. In diesem speziellen Tutorial werden wir Playwright für Web Scraping und lxml für das Parsen von HTML-Inhalten kombinieren, um die Details der Stelle zu sammeln, einschließlich Titel, Name des einstellenden Unternehmens, Ort, Stellenbeschreibung, Link zur Stellenausschreibung, und schließlich die Ergebnisse durch Speichern der Informationen in einer CSV-Datei zu präsentieren.
Um Scraping erfolgreich durchzuführen, müssen die folgenden Python-Bibliotheken installiert sein.
Playwright für die Browserautomatisierung:
pip install playwright
lxml zum Parsen von HTML:
pip install lxml
pandas zum Speichern von Daten in einer CSV-Datei:
pip install pandas
Playwright-Browser installieren:
Führen Sie nach der Installation von Playwright diesen Befehl aus, um die erforderlichen Browser-Binärdateien zu installieren:
playwright install
Mit Playwright können Sie Webbrowser automatisieren und mit ihnen interagieren. Wir beginnen damit, Playwright so einzurichten, dass es einen Chromium-Browser startet, eine Webseite besucht und deren Inhalt extrahiert. Hier können wir auch Proxys durch Playwright leiten.
Warum Proxys verwenden?
Websites haben oft Ratenbegrenzungs- oder Anti-Scraping-Maßnahmen eingerichtet, um wiederholte Anfragen von derselben IP-Adresse zu blockieren. Proxies ermöglichen es Ihnen,:
import asyncio
from playwright.async_api import async_playwright
async def get_page_content(url):
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
proxy = {
'server': '',
'username': '',
'password': ''
}
) # Headed Browser
page = await browser.new_page()
await page.goto(url)
# Extrahieren Sie den Inhalt der Seite
content = await page.content()
await browser.close() # Schließen Sie den Browser, wenn Sie fertig sind.
return content
In diesem Code startet async_playwright einen Kopfbrowser, navigiert zur angegebenen URL und ruft den Inhalt der Seite ab.
Als Nächstes werden wir den Seiteninhalt analysieren, um aussagekräftige Daten zu extrahieren. lxml wird zu diesem Zweck verwendet, da es robuste Unterstützung für das Parsen und Abfragen von HTML-Inhalten mit XPath bietet.
from lxml import html
def parse_job_listings(content):
# Parsen von HTML-Inhalten
parser = html.fromstring(content)
# Extrahieren Sie jede Stellenausschreibung mit XPath
job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
jobs_data = []
for element in job_posting[:-1]: # Überspringen Sie das letzte Element, wenn es sich um eine Anzeige oder ein irrelevantes Element handelt.
title = ''.join(element.xpath('.//h2/a/span/@title'))
if title:
link = ''.join(element.xpath('.//h2/a/@href'))
location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))
# Anhängen der extrahierten Daten an die Liste jobs_data
jobs_data.append({
'Title': title,
'Link': f"https://www.indeed.com{link}",
'Location': location,
'Description': description,
'Company': company_name
})
return jobs_data
Nun, da wir sowohl die Browser-Automatisierung als auch die Parsing-Schritte eingerichtet haben, kombinieren wir sie, um Stellenanzeigen von der Indeed-Seite zu scrapen.
Erläuterung:
import pandas as pd
async def scrape_indeed_jobs(url):
# Schritt 1: Abrufen von Seiteninhalten mit Playwright
content = await get_page_content(url)
# Schritt 2: Analysieren Sie den HTML-Code und extrahieren Sie die Auftragsdetails
jobs_data = parse_job_listings(content)
return jobs_data
# URL zum Scrapen
url = 'https://www.indeed.com/q-usa-jobs.html'
# Scraping und Speichern von Daten
async def main():
# Abrufen von Auftragsdaten von der angegebenen URL
jobs = await scrape_indeed_jobs(url)
# Schritt 3: Daten mit Pandas in CSV speichern
df = pd.DataFrame(jobs)
df.to_csv('indeed_jobs.csv', index=False)
print("Data saved to indeed_jobs.csv")
# Ausführen der Hauptfunktion
asyncio.run(main())
Indeed paginiert seine Stellenanzeigen, und Sie können den Scraper leicht erweitern, um mehrere Seiten zu verarbeiten. Die Seiten-URL wird mit einem Abfrageparameter start angepasst, der für jede neue Seite um 10 erhöht wird.
Um die Funktionalität Ihres Scrapers zum Sammeln von Daten von mehreren Seiten zu erweitern, können Sie eine Funktion namens scrape_multiple_pages implementieren. Diese Funktion ändert die Basis-URL, indem sie den Startparameter schrittweise anpasst und so den Zugriff auf nachfolgende Seiten ermöglicht. Indem Sie systematisch jede Seite durchgehen, können Sie den Umfang und die Menge der gesammelten Daten, z. B. Stellenangebote, erweitern und so einen umfassenderen Datensatz sicherstellen.
async def scrape_multiple_pages(base_url, pages=3):
all_jobs = []
for page_num in range(pages):
# URL für Paginierung aktualisieren
url = f"{base_url}&start={page_num * 10}"
print(f"Scraping page: {url}")
# Auftragsdaten von jeder Seite abrufen
jobs = await scrape_indeed_jobs(url)
all_jobs.extend(jobs)
# Alle Aufträge in CSV speichern
df = pd.DataFrame(all_jobs)
df.to_csv('indeed_jobs_all_pages.csv', index=False)
print("Data saved to indeed_jobs_all_pages.csv")
# Durchsuchen Sie mehrere Seiten mit Stellenangeboten
asyncio.run(scrape_multiple_pages('https://www.indeed.com/jobs?q=usa', pages=3))
Wenn Sie bei Ihren Scraping-Aktivitäten gezielt nach bestimmten Jobtiteln oder Schlüsselwörtern suchen möchten, müssen Sie den Parameter "Query Search" in der von Indeed verwendeten URL konfigurieren. Diese Anpassung ermöglicht es dem Scraper, Daten für bestimmte Stellen oder Branchen zu sammeln. Wenn Sie zum Beispiel auf http://www.indeed.com nach Stellen für Python-Entwickler suchen, würden Sie den Abfrageparameter so anpassen, dass er "Python+Entwickler" oder relevante Schlüsselwörter enthält.
query = "python+developer"
base_url = f"https://www.indeed.com/jobs?q={query}"
asyncio.run(scrape_multiple_pages(base_url, pages=3))
Indem Sie diesen Parameter entsprechend Ihren Anforderungen an die Datenerfassung ändern, können Sie Ihre Suche auf bestimmte Stellen konzentrieren und so die Flexibilität und Effizienz Ihres Datenerfassungsprozesses erhöhen. Dieser Ansatz ist besonders nützlich, um sich an die dynamischen Anforderungen des Arbeitsmarktes anzupassen.
import asyncio
from playwright.async_api import async_playwright
from lxml import html
import pandas as pd
# Schritt 1: Abrufen von Seiteninhalten mit Playwright
async def get_page_content(url):
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False
proxy = {
'server': '',
'username': '',
'password': ''
}
) # Browser im Kopfzeilenmodus ausführen
page = await browser.new_page()
await page.goto(url, wait_until='networkidle')
# Seiteninhalt extrahieren
content = await page.content()
await browser.close() # Browser nach Gebrauch schließen
return content
# Schritt 2: Parsen des HTML-Inhalts mit lxml
def parse_job_listings(content):
# Parsen des HTML mit lxml
parser = html.fromstring(content)
# Einzelne Stellenausschreibungen mit XPath auswählen
job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
# Auftragsdaten extrahieren
jobs_data = []
for element in job_posting[:-1]:
title = ''.join(element.xpath('.//h2/a/span/@title'))
if title:
link = ''.join(element.xpath('.//h2/a/@href'))
location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))
# Anhängen der extrahierten Daten an die Liste jobs_data
jobs_data.append({
'Title': title,
'Link': f"https://www.indeed.com{link}",
'Location': location,
'Description': description,
'Company': company_name
})
return jobs_data
# Schritt 3: Scrapen Sie Indeed-Jobs für eine einzelne Seite
async def scrape_indeed_jobs(url):
# Seiteninhalt mit Playwright abrufen
content = await get_page_content(url)
# Parsen von HTML und Extrahieren von Auftragsdaten
jobs_data = parse_job_listings(content)
return jobs_data
# Schritt 4: Paginierung und Scraping mehrerer Seiten
async def scrape_multiple_pages(base_url, query, pages=3):
all_jobs = []
for page_num in range(pages):
# Aktualisieren Sie die URL für die Paginierung und fügen Sie die Suchanfrage hinzu
url = f"{base_url}?q={query}&start={page_num * 10}"
print(f"Scraping page: {url}")
# Scrape-Aufträge für die aktuelle Seite
jobs = await scrape_indeed_jobs(url)
all_jobs.extend(jobs)
# Alle Aufträge in einer CSV-Datei speichern
df = pd.DataFrame(all_jobs)
df.to_csv(f'indeed_jobs_{query}.csv', index=False)
print(f"Data saved to indeed_jobs_{query}.csv")
# Funktion zum Ausführen des Scrapers mit dynamischer Abfrageeingabe
async def run_scraper():
# Schritt 5: Fragen Sie den Benutzer nach einer Eingabeanfrage und der Anzahl der zu durchsuchenden Seiten
query = input("Enter the job title or keywords to search (e.g., python+developer): ")
pages = int(input("Enter the number of pages to scrape: "))
# Scrape-Aufträge über mehrere Seiten auf der Grundlage der Abfrage
base_url = 'https://www.indeed.com/jobs'
await scrape_multiple_pages(base_url, query, pages)
# Den Abstreifer laufen lassen
asyncio.run(run_scraper())
Um einen reibungslosen Scraping-Prozess zu gewährleisten und das Risiko von Blockierungen und CAPTCHA-Erscheinungen zu verringern, ist es entscheidend, den richtigen Proxy-Server zu wählen. Die optimalste Option für Scraping sind ISP-Proxys, die eine hohe Geschwindigkeit und Verbindungsstabilität sowie einen hohen Vertrauensfaktor bieten, wodurch sie selten von Plattformen blockiert werden. Diese Art von Proxy ist statisch, so dass es für umfangreiches Scraping notwendig ist, einen Pool von ISP-Proxys zu erstellen und eine IP-Rotation für deren regelmäßigen Wechsel zu konfigurieren. Eine Alternative wären Residential-Proxys, die dynamisch sind und im Vergleich zu anderen Proxy-Servertypen die größte geografische Abdeckung haben.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Bemerkungen: 0