Upwork ist eines der größten Freelancing-Marktplätze im offenen Web, und seine öffentlichen Jobsuchseiten sind ein kontinuierliches Signal dafür, was Kunden gerade suchen. Jede Ausschreibung enthält einen Titel, ein Budget oder einen Stundensatz, eine Liste erforderlicher Fähigkeiten und ein Veröffentlichungsdatum, und genau diese Daten nutzen Recruiter, Marktforscher und Freelancer selbst, um die Nachfrage zu verfolgen: welche Fähigkeiten knapp sind, welche Preise eine Kategorie erzielt und wo neue Projektarbeit entsteht.
Dieser Leitfaden zeigt, wie man Upwork-Jobs scrapt mit JavaScript und Node.js unter Verwendung von cheerio. Sie erstellen einen kleinen, lauffähigen Scraper, der eine öffentliche Upwork-Jobsuchseite über die Crawling API abruft, den Titel, das Budget oder den Stundensatz, die erforderlichen Fähigkeiten, die Veröffentlichungszeit und den Link jeder Ausschreibung parst und das Ergebnis als JSON und CSV exportiert. Die gesamte Anleitung beschränkt sich auf öffentliche Stellenanzeigen. Sie berührt keine persönlichen Profile von Freelancern, Kontaktdaten oder Inhalte hinter einem Login, und der Abschnitt zur Rechtslage am Ende ist kein Boilerplate, also lesen Sie ihn, bevor Sie dies auf echtes Volumen anwenden.
Was Sie erstellen werden
Ein Node.js-Skript, das eine öffentliche Upwork-Jobsuch-URL nimmt, das gerenderte HTML über die Crawling API abruft und für jede Stellenanzeige auf der Ergebnisseite einen strukturierten Datensatz extrahiert. Wir verwenden eine Suche nach "SEO expert" als laufendes Beispiel und extrahieren diese Felder pro Ausschreibung:
- Titel der Titel der Stellenanzeige, zum Beispiel "SEO Expert for Technical Site Audit".
- Budget oder Stundensatz das Festpreisbudget oder die Stundenspanne, die auf der Karte angezeigt wird, wie "$1,000" oder "$25.00-$50.00".
- Fähigkeiten die Liste der erforderlichen Skill-Tags, die der Ausschreibung beigefügt sind.
- Veröffentlichungszeit die relative Veröffentlichungszeit, zum Beispiel "Posted 3 hours ago".
- Link die URL zur individuellen Stellenanzeige.
Warum eine einfache Anfrage bei Upwork scheitert
Wenn Sie eine Upwork-Jobsuch-URL mit einem einfachen HTTP-Client anfragen, erhalten Sie selten die Jobanzeigen zurück. Zwei Dinge arbeiten gegen Sie. Erstens rendert Upwork die Suchergebnisse im Browser mit JavaScript, sodass das anfängliche HTML eine fast leere Hülle ist, bis die Skripte der Seite ausgeführt werden. Zweitens markiert Upwork automatisierten Traffic aggressiv: Datacenter-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden herausgefordert, rate-limitiert oder blockiert, bevor sie die gerenderten Listings erreichen.
Ein funktionierender Upwork-Scraper benötigt also zwei Dinge in einer Anfrage: einen Browser, der die Seite tatsächlich rendert, und eine IP, die die Plattform als echten Besucher liest. Sie können das selbst zusammenbauen mit einem Headless Browser plus einem Pool rotierender Residential-Proxys, aber das Zusammenfügen und Gesundhalten dieser Komponenten ist der Großteil der Arbeit. Die Crawling API bündelt beides in einem einzigen Aufruf: Sie senden ihr die URL, sie rendert die Seite hinter einer vertrauenswürdigen IP und gibt fertiges HTML zurück, das Sie mit cheerio parsen. Mehr dazu, warum clientseitiges Rendering naive Scraper bricht, finden Sie in unserem Artikel zu JavaScript-Websites crawlen.
Die Crawling API gibt Ihnen zwei Tokens: einen normalen Token und einen JavaScript-Token. Upwork-Suchseiten werden clientseitig gerendert, daher benötigen Sie den JavaScript-Token (echtes Browser-Rendering), damit die Seite gefüllt zurückkommt. Eine Anfrage mit normalem Token liefert in der Regel eine leere Hülle.
Voraussetzungen
Bevor Sie Code schreiben, müssen einige Dinge vorhanden sein. Keines davon dauert lange.
Grundlegendes JavaScript und Node.js. Sie sollten in der Lage sein, ein Node-Skript zu schreiben und auszuführen sowie Pakete mit npm zu installieren. Wenn Sie neu bei Node sind, behandelt der Leitfaden zum Erstellen eines Web-Scrapers mit Node.js die Grundlagen, die dieses Tutorial voraussetzt.
Node.js 16 oder höher. Überprüfen Sie Ihre Version mit node --version. Wenn Sie es nicht haben, installieren Sie es von der Node.js-Website oder über einen Versionsmanager wie nvm.
Ein Crawlbase-Konto und ein Token. Melden Sie sich an, öffnen Sie Ihr Dashboard und kopieren Sie Ihren JavaScript-Token von der Account-Docs-Seite. Der kostenlose Tarif gibt Ihnen bis zu 20.000 Anfragen ohne Kreditkarte. Behandeln Sie den Token wie ein Passwort: Er authentifiziert Ihre Anfragen, also halten Sie ihn aus der Versionskontrolle heraus.
Das Projekt einrichten
Erstellen Sie einen Projektordner, initialisieren Sie ihn und installieren Sie die zwei Bibliotheken, die der Scraper benötigt.
node --version mkdir upwork-jobs-scraper && cd upwork-jobs-scraper npm init -y npm install crawlbase cheerio
Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Node-Client für die Crawling API, und cheerio parst das zurückgegebene HTML mit einer jQuery-ähnlichen API, sodass Sie einzelne Felder per CSS-Selektor extrahieren können. Erstellen Sie eine Datei namens upwork-scraper.js in diesem Ordner und fügen Sie den Code aus den folgenden Schritten hinzu.
Schritt 1: Die gerenderte Jobsuchseite abrufen
Beginnen Sie damit, die fertige Seite abzurufen. Importieren Sie die Klasse CrawlingAPI, initialisieren Sie sie mit Ihrem JavaScript-Token und fordern Sie die Such-URL an. Da Upwork clientseitig rendert, übergeben Sie der API eine kurze Wartezeit, damit ihre Skripte abgeschlossen sind, bevor das HTML erfasst wird. Das Überprüfen des Status-Codes vor dem Parsen macht Fehler laut statt still.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const upworkSearchURL = 'https://www.upwork.com/nx/search/jobs/?q=seo%20expert'; // Render the page in a real browser, then wait for scripts to settle const options = { ajax_wait: 'true', page_wait: 3000 }; api .get(upworkSearchURL, options) .then((response) => { if (response.statusCode === 200) { console.log(response.body.slice(0, 500)); } }) .catch((error) => console.error('API request error:', error));
Führen Sie das Skript mit node upwork-scraper.js aus, und Sie sollten echtes Upwork-Job-Markup am Anfang des Body sehen, keine abgespeckte Hülle. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben. Die Optionen ajax_wait und page_wait weisen die API an, die Seite in einem echten Browser auszuführen und den Skripten Zeit zu geben, die Jobanzeigen zu befüllen. Wenn Sie möchten, dass die API häufige Felder für Sie parst, anstatt Selektoren von Hand zu schreiben, übergeben Sie die Option autoparse und erhalten direkt strukturiertes JSON zurück.
// Ask the API to render and parse, returning JSON const options = { ajax_wait: 'true', page_wait: 3000, autoparse: 'true' }; api .get(upworkSearchURL, options) .then((response) => { if (response.statusCode === 200) { console.log(JSON.parse(response.body)); } }) .catch((error) => console.error('API request error:', error));
Diese erste Anfrage hat gerade eine vollständig gerenderte Upwork-Suchseite zurückgegeben, ohne Headless Browser oder Proxy auf Ihrer Seite. Die Crawling API führt die Seite in einem echten Browser aus, wartet, bis ihr JavaScript die Jobanzeigen befüllt, rotiert serverseitig durch Residential-IPs und behandelt die Herausforderungen, die Upwork Scrapern stellt, sodass Sie fertiges HTML (oder autoparsiertes JSON) aus einem Aufruf erhalten. Probieren Sie es zunächst mit einer öffentlichen Jobsuche im kostenlosen Tarif aus.
Schritt 2: Jede Stellenanzeige mit cheerio parsen
Mit dem gerenderten HTML laden Sie es in cheerio und durchlaufen die Jobanzeigen. Upwork legt jede Ausschreibung in einem sich wiederholenden Article-Container auf der Suchergebnisseite aus, sodass Sie jede Karte auswählen und dann den Titel, das Budget oder den Stundensatz, die Fähigkeiten, die Veröffentlichungszeit und den Link von innen lesen. Jedes Feld defensiv zu lesen verhindert, dass ein einzelner fehlender Wert den Lauf zum Absturz bringt.
const cheerio = require('cheerio'); function parseJobs(html) { const $ = cheerio.load(html); const jobs = []; const cards = $('article[data-test="JobTile"]'); cards.each((index, element) => { const card = $(element); const job = {}; // Title and link share one anchor const titleLink = card.find('[data-test="job-tile-title-link"]'); job.title = titleLink.text().trim(); const href = titleLink.attr('href'); job.link = href ? new URL(href, 'https://www.upwork.com').href : ''; // Posted time, e.g. "Posted 3 hours ago" job.posted = card .find('[data-test="job-pubilshed-date"]') .text() .replace(/\s+/g, ' ') .trim(); // Budget (fixed price) or hourly rate range const budget = card .find('[data-test="is-fixed-price"] strong') .last() .text() .trim(); const hourly = card .find('[data-test="job-type-label"]') .text() .trim(); job.budget = budget || hourly || 'Not specified'; // Required skill tags job.skills = card .find('[data-test="token"] span') .map((i, el) => $(el).text().trim()) .get() .filter(Boolean); if (job.title) jobs.push(job); }); return jobs; }
Einige Details halten dies nahe an der Seite. Titel und Link stammen aus demselben job-tile-title-link-Anker, sodass eine Abfrage beides liefert, und das relative href wird zu einer absoluten URL aufgelöst, sodass es außerhalb der Seite funktioniert. Die Veröffentlichungszeit wird aus dem Attribut job-pubilshed-date gelesen (Upworks eigene Schreibweise, unverändert, damit der Selektor passt), mit zusammengefasstem Leerzeichen. Die Budget-Behandlung deckt beide Ausschreibungstypen ab: Ein Festpreisauftrag zeigt seinen Betrag innerhalb des is-fixed-price-Blocks, während ein Stundenauftrag sein Ratenlabel in job-type-label trägt, sodass der Parser den jeweils vorhandenen nimmt. Fähigkeiten werden aus den Token-Tags in ein sauberes Array gesammelt.
Upworks data-test-Attribute sind stabiler als generierte Klassennamen, aber sie ändern sich dennoch ohne Ankündigung. Behandeln Sie die obigen Selektoren als Startvorlage, nicht als Vertrag. Wenn ein Feld leer zurückkommt, inspizieren Sie die Live-Seite in den Dev Tools Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Selektor-Wartung ist bei jedem Produktions-Scraper normal, kein Zeichen dafür, dass etwas kaputt ist.
Schritt 3: Das vollständige Skript mit JSON- und CSV-Export zusammenbauen
Verbinden Sie jetzt Abruf und Parse zu einem lauffähigen Skript und schreiben Sie die Datensätze als JSON und CSV auf die Festplatte. Das Abrufen ohne autoparse gibt rohes gerendertes HTML zurück, was der cheerio-Parser erwartet.
const fs = require('fs'); const { CrawlingAPI } = require('crawlbase'); const cheerio = require('cheerio'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); async function crawl(pageUrl) { const options = { ajax_wait: 'true', page_wait: 3000 }; const response = await api.get(pageUrl, options); if (response.statusCode === 200) return response.body; console.error(`Request failed: ${response.statusCode}`); return null; } function toCsv(rows) { const headers = ['title', 'budget', 'skills', 'posted', 'link']; const escape = (value) => `"${String(value).replace(/"/g, '""')}"`; const lines = [headers.join(',')]; for (const row of rows) { const flat = { ...row, skills: row.skills.join('; ') }; lines.push(headers.map((h) => escape(flat[h])).join(',')); } return lines.join('\n'); } async function main() { const url = 'https://www.upwork.com/nx/search/jobs/?q=seo%20expert'; const html = await crawl(url); if (!html) return; const jobs = parseJobs(html); fs.writeFileSync('upwork-jobs.json', JSON.stringify(jobs, null, 2)); fs.writeFileSync('upwork-jobs.csv', toCsv(jobs)); console.log(`Saved ${jobs.length} job postings to JSON and CSV`); } main();
Fügen Sie die Funktion parseJobs aus Schritt 2 in dieselbe Datei ein, damit main sie aufrufen kann. Führen Sie das Skript mit node upwork-scraper.js aus und Sie erhalten zwei Dateien: upwork-jobs.json mit den vollständigen strukturierten Datensätzen und upwork-jobs.csv, die direkt in einer Tabelle geöffnet werden kann. Der Helfer toCsv flacht das Skills-Array in eine einzelne semikolongetrennte Zelle, zitiert jedes Feld und verdoppelt eingebettete Anführungszeichen, was wichtig ist, da Jobtitel oft Kommas enthalten.
Wie die Ausgabe aussieht
Die JSON-Datei enthält ein Objekt pro Ausschreibung in der Reihenfolge der Suchergebnisse, jedes mit Titel, Budget oder Stundensatz, Fähigkeiten, Veröffentlichungszeit und Link.
[ { "title": "SEO Expert for Technical Site Audit", "budget": "$1,000", "skills": ["SEO", "Technical SEO", "On-Page SEO"], "posted": "Posted 3 hours ago", "link": "https://www.upwork.com/jobs/SEO-Expert-Technical-Site-Audit_~012abc" }, { "title": "Ongoing SEO Content Strategy", "budget": "Hourly: $25.00-$50.00", "skills": ["SEO", "Content Writing", "Keyword Research"], "posted": "Posted yesterday", "link": "https://www.upwork.com/jobs/Ongoing-SEO-Content-Strategy_~034def" } ]
Die CSV spiegelt dieselben Zeilen mit einer Kopfzeile wider und kann direkt in Excel, Google Sheets oder jede Datenpipeline importiert werden, die Trennzeichendateien liest.
title,budget,skills,posted,link "SEO Expert for Technical Site Audit","$1,000","SEO; Technical SEO; On-Page SEO","Posted 3 hours ago","https://www.upwork.com/jobs/SEO-Expert-Technical-Site-Audit_~012abc" "Ongoing SEO Content Strategy","Hourly: $25.00-$50.00","SEO; Content Writing; Keyword Research","Posted yesterday","https://www.upwork.com/jobs/Ongoing-SEO-Content-Strategy_~034def"
Auf mehrere Suchen und Seiten skalieren
Eine Suche ist eine Demo; eine echte Aufgabe läuft über mehrere Abfragen und mehrere Ergebnisseiten. Upworks Such-URL nimmt einen q-Query-Parameter und einen page-Parameter, sodass Sie eine Liste von Suchen erstellen, jede durchblättern, jede Seite mit derselben Funktion parsen und jede Zeile mit ihrer Abfrage markieren können, bevor Sie exportieren. Da jede Suchergebnisseite dieselbe Kartenstruktur teilt, funktioniert der Parser, den Sie bereits geschrieben haben, über alle ohne Änderungen.
const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); async function scrapeSearch(query, pages) { const all = []; for (let page = 1; page <= pages; page++) { const url = `https://www.upwork.com/nx/search/jobs/?q=${encodeURIComponent( query )}&page=${page}`; const html = await crawl(url); if (!html) continue; const rows = parseJobs(html).map((j) => ({ query, ...j })); all.push(...rows); await sleep(2000); } return all; } scrapeSearch('seo expert', 3).then((rows) => { console.log(`Collected ${rows.length} postings across pages`); });
Dieses Muster eignet sich direkt für Job-Marktforschung und Recruiting-Arbeit. Für denselben Ansatz auf anderen Stellenplattformen sehen Sie, wie man Indeed-Jobausschreibungen scrapt und wie man Monster-Jobs mit Python scrapt, die die Ergebnisseiten dieser Seiten abdecken.
Nicht blockiert werden
Selbst mit übernommenem Rendering beobachtet Upwork Scraper-artigen Traffic. Ein paar Gewohnheiten halten einen Lauf gesund, und sie gelten für jedes schwierige kommerzielle Ziel.
-
Anfragen drosseln. Fügen Sie eine Verzögerung zwischen Seitenabrufen ein, anstatt Seiten in einer engen Schleife zu bombardieren, wie der obige
sleep-Aufruf es tut. Das Verteilen von Anfragen ist der einzelne größte Faktor, um unter Upworks Rate-Limits zu bleiben. - Auf Rotation setzen. Ein Pool von Residential-IPs verteilt Anfragen auf viele echte Nutzeradressen, sodass keine einzelne ein Limit oder eine Herausforderung auslöst. Die Crawling API übernimmt dies für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist dies der Teil, den Sie richtig machen müssen.
- Status-Codes lesen. Ein Lauf, der beginnt, Herausforderungen oder Nicht-200-Antworten zurückzugeben, signalisiert Ihnen, dass die aktuelle Rate oder IP-Stufe nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückrudern, nicht als Rauschen zum Ignorieren.
Für das breitere Playbook sehen Sie, wie man Websites scrapt, ohne blockiert zu werden.
Ist es legal, Upwork zu scrapen?
Ob das Scrapen von Upwork erlaubt ist, hängt von Upworks Nutzungsbedingungen, Ihrer Rechtsordnung und dem ab, was Sie mit den Daten tun. Upworks Bedingungen beschränken automatisierten Zugang und Scraping, sodass das Erfassen von Daten gegen diese Bedingungen verstoßen kann, unabhängig davon, wie sorgfältig Ihr Tooling ist. Nichts am Code hier ändert das; er lässt nur den technischen Teil funktionieren. Lesen Sie Upworks Nutzungsbedingungen und seine robots.txt und behandeln Sie beides als Grenze für das, was Sie erfassen. Beachten Sie Upworks angegebene Rate-Erwartungen und halten Sie Ihr Anfragevolumen niedrig genug, dass Sie seine Server nicht belasten.
Dieser Leitfaden ist bewusst auf öffentliche Stellenanzeigen beschränkt: Titel, Budget oder Stundensatz, erforderliche Fähigkeiten, Veröffentlichungszeit und der Link zur Ausschreibung, die jeder auf einer öffentlichen Suchseite sehen kann, ohne sich anzumelden. Er berührt keine Freelancer-Profile, Namen, Fotos, Kontaktdaten, Arbeitshistorie, Einnahmen oder andere personenbezogene Daten, und er deckt nichts hinter einem Login ab. Diese Grenze ist rechtlich wichtig. Stellenanzeigen sind öffentliche Geschäftslisten, aber Freelancer-Profile sind personenbezogene Daten, und sobald Sie Daten über identifizierbare Personen erfassen, fallen Sie unter das Datenschutzrecht. Unter der DSGVO in der EU und dem CCPA in Kalifornien benötigt das Scrapen und Speichern personenbezogener Daten eine Rechtsgrundlage, und Personen haben Rechte auf Auskunft und Löschung. Die sichere und vertretbare Position ist, bei den öffentlichen Ausschreibungen zu bleiben, niemals Profile von Einzelpersonen zu erstellen und niemals Kontaktdaten für unaufgeforderte Kontaktaufnahme zu sammeln.
Wenn Ihr Projekt mehr als öffentliche Ausschreibungen erfordert oder Sie garantierte Struktur und kommerzielle Rechte wünschen, suchen Sie nach einem offiziellen Kanal statt nach einem cleveren Scraper. Upwork bietet ein Enterprise- und API-Programm für sanktionierten Datenzugang mit klaren Nutzungsbedingungen, das das richtige Werkzeug ist, wenn Sie Volumen oder eine vertragliche Grundlage benötigen. Für aggregierte, nicht-persönliche Marktforschung (welche Fähigkeiten gefragt sind, welche Preise eine Kategorie erzielt, wie sich das Ausschreibungsvolumen entwickelt) sind öffentliche Ausschreibungen ohne individuelle Identität in der Regel ausreichend, und genau das sammelt dieser Scraper.
Wichtigste Erkenntnisse
- Upwork rendert Suchergebnisse clientseitig und blockiert stark. Eine einfache Anfrage gibt eine leere Hülle oder eine Herausforderung zurück, daher müssen Sie die Seite hinter einer vertrauenswürdigen IP rendern, bevor Sie sie parsen.
-
Die Crawling API erledigt beides in einem Aufruf. Verwenden Sie den JavaScript-Token mit
ajax_waitundpage_wait, damit die Jobanzeigen sich befüllen; nehmen Sie rohes HTML zum selbst parsen oder übergeben Sieautoparse: 'true'für JSON. - cheerio extrahiert die Felder. Wählen Sie jede Jobanzeige aus, lesen Sie dann Titel, Budget oder Stundensatz, Fähigkeiten, Veröffentlichungszeit und Link, und rechnen Sie damit, dass Selektoren sich im Laufe der Zeit verschieben.
- In JSON und CSV exportieren. Schreiben Sie strukturierte Datensätze in beide Formate, flachen Sie das Skills-Array und zitieren Sie CSV-Felder, damit kommahaltige Titel intakt bleiben.
- Nur bei öffentlichen Ausschreibungen bleiben. Erfassen Sie öffentliche Jobdaten, niemals Freelancer-Profile oder persönliche Details, beachten Sie Upworks ToS und robots.txt und achten Sie auf DSGVO und CCPA, wenn personenbezogene Daten im Spiel sind.
Häufig gestellte Fragen
Welche Daten kann ich legal von Upwork scrapen?
Beschränken Sie sich auf öffentliche Stellenanzeigen: Titel, Budget oder Stundensatz, erforderliche Fähigkeiten, Veröffentlichungszeit und den Link zu jeder Ausschreibung, die alle auf einer öffentlichen Suchseite ohne Anmeldung erscheinen. Vermeiden Sie Freelancer-Profile, Namen, Fotos, Kontaktdaten, Arbeitshistorie und Einnahmen, da diese personenbezogene Daten sind und unter das Datenschutzrecht fallen. Dieser Leitfaden ist aus genau diesem Grund nur auf öffentliche Ausschreibungen beschränkt.
Warum gibt eine einfache Anfrage unvollständige Daten von Upwork zurück?
Weil Upwork seine Suchergebnisse clientseitig mit JavaScript rendert und automatisierten Traffic herausfordert. Eine rohe HTTP-Anfrage von einer Datacenter-IP gibt in der Regel eine leere Hülle oder eine Blockseite zurück, nicht die Jobanzeigen. Um eine vollständige Seite zu erhalten, müssen Sie sie in einem echten Browser hinter einer vertrauenswürdigen IP rendern, was die Crawling API für Sie übernimmt, wenn Sie den JavaScript-Token verwenden.
Benötige ich den normalen Token oder den JavaScript-Token?
Verwenden Sie den JavaScript-Token. Upwork-Suchseiten werden im Browser gerendert, sodass eine Anfrage mit normalem Token eine unbefüllte Hülle zurückgibt. Der JavaScript-Token führt die Seite in einem echten Browser aus, und das Übergeben von ajax_wait mit einem kurzen page_wait gibt den Skripten der Seite Zeit, die Jobanzeigen zu befüllen, bevor das HTML erfasst wird.
Meine Selektoren geben leere Werte zurück. Was hat sich geändert?
Mit ziemlicher Sicherheit Upworks Markup. Selbst die hier verwendeten data-test-Attribute können sich ohne Ankündigung ändern, sodass Selektoren, die letzten Monat funktionierten, jetzt brechen können. Inspizieren Sie eine Live-Seite in den Dev Tools Ihres Browsers und aktualisieren Sie die Selektoren. Regelmäßige Selektor-Wartung ist bei jedem Produktions-Scraper normal.
Kann ich Freelancer-Profile oder Kontaktdaten von Upwork scrapen?
Nein, und dieser Leitfaden behandelt das nicht. Freelancer-Profile, Namen, Kontaktdaten, Arbeitshistorie und Einnahmen sind personenbezogene Daten, keine öffentlichen Geschäftslisten, sodass das Scrapen DSGVO- und CCPA-Verpflichtungen auslöst und gegen Upworks Bedingungen verstößt. Beschränken Sie Ihre Erfassung auf öffentliche Stellenanzeigen, erstellen Sie niemals Profile von Einzelpersonen und sammeln Sie niemals Kontaktdaten für unaufgeforderte Kontaktaufnahme. Für sanktionierten Zugang zu mehr als öffentlichen Ausschreibungen verwenden Sie Upworks offizielle API oder das Enterprise-Programm.
Wie vermeide ich Blockierungen beim Scrapen von Upwork?
Halten Sie Ihre Anfragerate pro IP niedrig, fügen Sie Verzögerungen zwischen Seitenabrufen ein und leiten Sie durch rotierende Residential-IPs, sodass keine einzelne Adresse ein Rate-Limit oder eine Herausforderung auslöst. Die Crawling API verwaltet Rotation, einen vertrauenswürdigen IP-Pool und die Behandlung von Herausforderungen für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, in den Sie investieren sollten. Beobachten Sie die Status-Codes und rudern Sie zurück, wenn Sie anfangen, Nicht-200-Antworten zu sehen.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
