Product Hunt ist der Ort, an dem täglich neue Software, Hardware und Nebenprojekte gestartet und gerankt werden, und die öffentliche Seite dieses Rankings ist ein sauberes Signal für jeden, der verfolgt, was Entwickler ausliefern. Gründer beobachten es, um Konkurrenten einzuschätzen, Forscher nutzen es, um Kategorie-Trends zu erkennen, und Wachstumsteams untersuchen, welche Launches die meisten Upvotes erhalten. Die Daten stehen direkt auf jeder Kategorieseite: Produktnamen, Taglines, Upvote-Anzahlen und ein Link zu jedem Listing.

Diese Anleitung zeigt Ihnen, wie Sie Product Hunt scrapen können, mit JavaScript und Node.js unter Verwendung von Cheerio. Sie bauen einen kleinen, lauffähigen Scraper, der eine Product Hunt-Kategorieseite über die Crawling API abruft, den Produktnamen, die Tagline, die Upvotes und den Link für jedes Listing parst, optional grundlegende öffentliche Maker-Details von einer Profilseite zieht, die Paginierung verwaltet und das Ergebnis als JSON und CSV exportiert. Die gesamte Anleitung beschränkt sich auf öffentliche Produktdaten, und der Abschnitt zur Rechtslage am Ende ist kein Boilerplate, also lesen Sie ihn, bevor Sie dies auf ein echtes Volumen anwenden.

Was Sie bauen werden

Ein Node.js-Skript, das eine öffentliche Product Hunt-Kategorie-URL nimmt, das gerenderte HTML über die Crawling API abruft und für jedes Produkt auf der Liste einen strukturierten Datensatz extrahiert. Wir verwenden die Kategorieseite für Engineering und Entwicklung als laufendes Beispiel und extrahieren diese Felder pro Artikel:

  • Name der Produktname, wie er auf der Listing-Karte angezeigt wird.
  • Tagline die kurze Beschreibungszeile, die unter dem Namen steht.
  • Upvotes die Upvote-Anzahl, zu einer Zahl geparst, wenn vorhanden.
  • Reviews der Text der Rezensionsanzahl, wie "151 reviews".
  • Link die URL zur individuellen Produktseite.

Später in der Anleitung fügen wir einen separaten Durchlauf hinzu, der grundlegende öffentliche Profilfelder für einen Maker liest, wie Name, Überschrift, Follower- und Following-Anzahl sowie Punkte, damit Sie sehen können, wie derselbe Ansatz von Listings auf ein einzelnes öffentliches Profil erweitert werden kann.

Warum eine einfache Anfrage bei Product Hunt scheitert

Wenn Sie eine Product Hunt-Kategorie-URL mit einem einfachen HTTP-Client anfordern, bekommen Sie selten die Produktliste zurück. Zwei Dinge arbeiten gegen Sie. Erstens rendert Product Hunt seine Listing-Karten im Browser mit JavaScript, sodass das anfängliche HTML eine fast leere Shell ist, bis die Skripte der Seite ausgeführt werden. Zweitens überwacht die Plattform automatisierten Datenverkehr: Datacenter-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden ratenbegrenzt oder blockiert, bevor sie die gerenderten Produktdaten erreichen.

Ein funktionierender Product Hunt-Scraper benötigt daher 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 mit einem Headless-Browser plus einem Pool rotierender residentieller Proxys zusammenstellen, aber das Zusammenführen und Gesundhalten davon ist der größte Teil der Arbeit. Die Crawling API faltet beides in einen 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 können.

Warum das JavaScript-Token

Da Product Hunt seine Listings clientseitig aufbaut, fordern Sie diese Seiten mit aktiviertem JavaScript-Rendering der Crawling API an. Im offiziellen Node-Client bedeutet das, ihn mit Ihrem JavaScript-Token zu initialisieren. Gerenderte Anfragen kosten mehr Credits als einfache, sodass das kostenlose Kontingent Ihnen immer noch ermöglicht, den gesamten Ablauf von Anfang bis Ende zu testen, bevor Sie hochskalieren.

Voraussetzungen

Vor dem Schreiben von Code müssen einige Dinge eingerichtet sein. Keines davon dauert lange.

Grundlegendes JavaScript und Node.js. Sie sollten damit vertraut sein, ein Node-Skript zu schreiben und auszuführen, Pakete mit npm zu installieren und mit den DOM-Konzepten zu arbeiten, die Cheerio spiegelt. Wenn Sie neu in Node sind, deckt der Leitfaden zu Web-Scraper mit Node.js erstellen die Grundlagen ab, die dieses Tutorial voraussetzt.

Node.js 16 oder höher. Bestätigen Sie Ihre Version mit node --version. Falls Sie es nicht haben, installieren Sie es von der Node.js-Website oder über einen Versionsmanager wie nvm.

Ein Crawlbase-Konto und Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr JavaScript-Token von der Konto-Docs-Seite. Das kostenlose Kontingent gibt Ihnen bis zu 20.000 Anfragen ohne Kreditkarte. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, halten Sie es daher aus der Versionskontrolle heraus.

Projekt einrichten

Erstellen Sie einen Projektordner, initialisieren Sie ihn und installieren Sie die beiden Bibliotheken, die der Scraper benötigt.

bash
node --version

mkdir producthunt-scraper && cd producthunt-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-artigen API, sodass Sie einzelne Felder per CSS-Selektor herausziehen können. Erstellen Sie eine Datei namens scraper.js in diesem Ordner und fügen Sie den Code aus den folgenden Schritten hinzu.

Schritt 1: Die gerenderte Kategorieseite abrufen

Beginnen Sie damit, die fertige Seite zu holen. Importieren Sie die Klasse CrawlingAPI, initialisieren Sie sie mit Ihrem JavaScript-Token und fordern Sie die Kategorie-URL an. Das Speichern des Bodys auf der Festplatte ermöglicht Ihnen, das echte Markup einmal zu überprüfen und dann Selektoren zu iterieren, ohne jedes Mal eine Anfrage zu verbrauchen.

javascript
const { CrawlingAPI } = require('crawlbase');
const fs = require('fs');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

const producthuntPageURL =
  'https://www.producthunt.com/categories/engineering-development';

api
  .get(producthuntPageURL)
  .then((response) => {
    if (response.statusCode === 200) {
      fs.writeFileSync('response.html', response.body);
      console.log('HTML saved to response.html');
    }
  })
  .catch((error) => console.error('API request error:', error));

Führen Sie das Skript mit node scraper.js aus, und Sie sollten echtes Product Hunt-Markup in response.html gespeichert sehen, nicht eine abgespeckte Shell. Das bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben. Ersetzen Sie die Beispiel-URL durch die gewünschte Kategorieseite; jede Kategorie befindet sich unter /categories/ auf derselben Domain.

Crawlbase Crawling API

Diese erste Anfrage hat gerade eine vollständig gerenderte Product Hunt-Kategorieseite zurückgegeben, ohne einen Headless-Browser oder einen Proxy auf Ihrer Seite. Die Crawling API führt die Seite in einem echten Browser aus, rotiert serverseitig durch residentielle IPs und verwaltet die Ratenbeschränkungen, die die Plattform Scrapern entgegenwirft, sodass Sie fertiges HTML aus einem Aufruf erhalten. Richten Sie es zunächst auf die Kategorie Engineering und Entwicklung im kostenlosen Tarif.

Schritt 2: Jedes Produkt mit Cheerio parsen

Mit gerendertem HTML laden Sie es in Cheerio und durchlaufen die Produktkarten. Product Hunt legt jedes Listing in einem sich wiederholenden Container aus, also wählen Sie jede Karte aus und lesen dann Name, Tagline, Upvotes, Reviews und Link aus ihr heraus. Jedes Feld defensiv zu lesen verhindert, dass ein fehlender Wert den Lauf zum Absturz bringt.

javascript
const fs = require('fs');
const cheerio = require('cheerio');

function parseProducts(html) {
  const $ = cheerio.load(html);
  const products = [];

  const containers = $(
    'div.flex.direction-column.mb-mobile-10.mb-tablet-15.mb-desktop-15.mb-widescreen-15'
  );

  containers.each((index, element) => {
    const card = $(element);

    const name = card
      .find('div.color-blue.fontSize-18.fontWeight-600')
      .text()
      .trim();

    // Each filled star is one label element inside the rating row
    const upvotes = card.find(
      'div.flex.direction-row.align-center label'
    ).length;

    const reviews = card
      .find('div.ml-3.color-lighter-grey.fontSize-14.fontWeight-400')
      .text()
      .trim();

    const tagline = card
      .find(
        'div.color-lighter-grey.fontSize-mobile-14.fontSize-tablet-16.fontSize-desktop-16.fontSize-widescreen-16.fontWeight-400'
      )
      .text()
      .trim();

    const href = card.find('a').first().attr('href');
    const link = href
      ? new URL(href, 'https://www.producthunt.com').href
      : '';

    if (name) {
      products.push({ rank: index + 1, name, tagline, upvotes, reviews, link });
    }
  });

  return products;
}

Einige Details halten dies der Seite treu. Der Produktname kommt aus dem color-blue fontSize-18 fontWeight-600-Block und die Tagline aus der langen color-lighter-grey-Schriftgrössen-Klassenkette, die Product Hunt für die Beschreibungszeile verwendet. Die Upvote- und Bewertungszeile rendert ein label-Element pro ausgefülltem Marker, sodass das Zählen dieser label-Elemente die Anzahl ohne Textparsing ergibt. Der Text der Rezensionsanzahl befindet sich in seinem eigenen ml-3 color-lighter-grey-Block, und der Link wird aus dem ersten Anker der Karte gelesen und zu einer absoluten URL aufgelöst, damit er außerhalb der Seite funktioniert.

Selektoren driften

Die Klassennamen von Product Hunt (die langen fontSize-*-Ketten und der Rest) werden generiert und ändern sich ohne Ankündigung. Behandeln Sie die obigen Selektoren als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld leer zurückkommt, untersuchen Sie die Live-Seite in den Entwicklertools Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Selektor-Wartung ist bei jedem Produktionsscraper normal, kein Zeichen für einen Defekt. Für die breitere Technik lesen Sie wie man JavaScript-Websites crawlt.

Schritt 3: Das vollständige Skript mit JSON- und CSV-Export zusammenstellen

Verbinden Sie nun den Abruf und das Parsen zu einem einzigen lauffähigen Skript und schreiben Sie dann die Datensätze als JSON und CSV auf die Festplatte.

javascript
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 response = await api.get(pageUrl);
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function toCsv(rows) {
  const headers = ['rank', 'name', 'tagline', 'upvotes', 'reviews', 'link'];
  const escape = (value) =>
    `"${String(value).replace(/"/g, '""')}"`;
  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

async function main() {
  const url =
    'https://www.producthunt.com/categories/engineering-development';
  const html = await crawl(url);
  if (!html) return;

  const products = parseProducts(html);
  fs.writeFileSync('products.json', JSON.stringify(products, null, 2));
  fs.writeFileSync('products.csv', toCsv(products));
  console.log(`Saved ${products.length} products to JSON and CSV`);
}

main();

Fügen Sie die parseProducts-Funktion aus Schritt 2 in dieselbe Datei ein, damit main sie aufrufen kann. Führen Sie es mit node scraper.js aus, und Sie erhalten zwei Dateien: products.json mit den vollständigen strukturierten Datensätzen und products.csv, bereit zum Öffnen in einer Tabellenkalkulation. Der toCsv-Helfer setzt jedes Feld in Anführungszeichen und verdoppelt eingebettete Anführungszeichen, was hier wichtig ist, weil Produkt-Taglines lang sind und häufig Kommas enthalten.

Wie die Ausgabe aussieht

Die JSON-Datei enthält ein Objekt pro Produkt in Listing-Reihenfolge, jeweils mit Rang, Name, Tagline, Upvote-Anzahl, Rezensions-Anzahl-Text und Link.

json
[
  {
    "rank": 1,
    "name": "The Free Website Guys",
    "tagline": "A free website program that has helped over 10,000 entrepreneurs.",
    "upvotes": 5,
    "reviews": "151 reviews",
    "link": "https://www.producthunt.com/products/the-free-website-guys"
  },
  {
    "rank": 2,
    "name": "Zipy",
    "tagline": "A debugging platform with session replay and network monitoring.",
    "upvotes": 5,
    "reviews": "132 reviews",
    "link": "https://www.producthunt.com/products/zipy"
  }
]

Die CSV spiegelt dieselben Zeilen mit einer Headerzeile wider, sodass sie direkt in Excel, Google Sheets oder jede Datenpipeline fällt, die begrenzte Dateien liest.

csv
rank,name,tagline,upvotes,reviews,link
"1","The Free Website Guys","A free website program that has helped over 10,000 entrepreneurs.","5","151 reviews","https://www.producthunt.com/products/the-free-website-guys"
"2","Zipy","A debugging platform with session replay and network monitoring.","5","132 reviews","https://www.producthunt.com/products/zipy"

Paginierung über die Kategorie hinweg verwalten

Eine Seite ist eine Demo; ein echter Job geht durch die gesamte Kategorie. Product Hunt lädt mehr Listings, wenn Sie scrollen, und Kategorieseiten akzeptieren auch einen Seitenparameter, den Sie durchsteppen können. Das einfachste zuverlässige Muster ist es, aufeinanderfolgende Seiten abzurufen, jede mit derselben Funktion zu parsen und zu stoppen, wenn eine Seite keine neuen Produkte zurückgibt. Die Schleife mit einer kurzen Verzögerung zu verteilen, hält Ihre Anfragerate ruhig.

javascript
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

async function scrapeCategory(slug, maxPages = 5) {
  const all = [];
  for (let page = 1; page <= maxPages; page++) {
    const url =
      `https://www.producthunt.com/categories/${slug}?page=${page}`;
    const html = await crawl(url);
    if (!html) break;

    const rows = parseProducts(html);
    if (rows.length === 0) break;

    all.push(...rows.map((p) => ({ category: slug, ...p })));
    await sleep(2000);
  }
  return all;
}

scrapeCategory('engineering-development').then((rows) => {
  console.log(`Collected ${rows.length} products`);
});

Da jede Kategorieseite dieselbe Kartenstruktur teilt, funktioniert der Parser, den Sie bereits geschrieben haben, über alle hinweg ohne Änderungen. Kennzeichnen Sie jede Zeile mit ihrer Kategorie vor dem Export, und Sie können vergleichen, was in einem Datensatz zum Beispiel in Engineering, Design und KI ausgeliefert wird. Dieses Muster trägt sich direkt in die Produktrecherche; für einen tieferen Einblick in die Umwandlung geordneter Listings in Entscheidungen lesen Sie wie man E-Commerce-Produktrecherche automatisiert.

Grundlegende öffentliche Profildaten scrapen

Derselbe Abrufen-dann-Parsen-Ansatz funktioniert auf einem einzelnen öffentlichen Maker-Profil. Profile stellen grundlegende öffentliche Felder bereit wie einen Anzeigenamen, eine Überschrift, Follower- und Following-Anzahlen, Punkte und die Produkte, die ein Maker ausgeliefert hat. Die frühere Version dieser Anleitung las diese von der Profilseite; der folgende Ausschnitt portiert dieselben Felder. Beschränken Sie dies ausschließlich auf grundlegende öffentliche Profilbasisdaten und lesen Sie den Abschnitt zur Rechtslage, bevor Sie ihn ausführen.

javascript
function parseProfile(html, handle) {
  const $ = cheerio.load(html);
  const profile = {};

  profile.name = $(
    'h1.color-darker-grey.fontSize-24.fontWeight-600'
  ).text().trim();
  profile.headline = $(
    'div.color-lighter-grey.fontSize-18.fontWeight-300'
  ).text().trim();
  profile.followers = $(
    `a[href="/@${handle}/followers"]`
  ).text().trim();
  profile.following = $(
    `a[href="/@${handle}/following"]`
  ).text().replace(/\n\s+/g, ' ').trim();
  profile.points = $(
    'span.color-lighter-grey.fontSize-14.fontWeight-400:contains("points")'
  ).text().trim();

  // Public list of products the maker has shipped
  profile.products = [];
  $('.styles_even__Qeyum, .styles_odd__wazk7').each((i, el) => {
    profile.products.push({
      name: $(el).find('img.styles_thumbnail__Y9ZpZ').attr('alt'),
    });
  });

  return profile;
}

async function scrapeProfile(handle) {
  const html = await crawl(`https://www.producthunt.com/@${handle}`);
  return html ? parseProfile(html, handle) : null;
}

Die Selektoren spiegeln die bisherigen Felder wider: den Anzeigenamen aus der h1.color-darker-grey-Überschrift, die Überschrift aus der fontSize-18 fontWeight-300-Zeile, die Follower- und Following-Anzahlen aus den Ankern, die auf die eigenen Follower- und Following-Seiten des Handles verlinken, und die Gesamtpunktzahl aus dem Span, der das Wort "points" enthält. Die Produktliste liest den alt-Text jedes Miniaturbilds. Ziehen Sie nur diese öffentlichen Grunddaten heraus und gehen Sie nicht weiter in alles, was eine Privatperson identifiziert.

Nicht blockiert bleiben

Auch wenn das Rendering übernommen wurde, überwacht Product Hunt Datenverkehr mit Scraper-förmigen Mustern. Einige Gewohnheiten halten einen Lauf gesund, die für jedes kommerzielle Ziel gelten.

  • Verteilen Sie Ihre Anfragen. Führen Sie eine Verzögerung zwischen Seitenabfragen ein, anstatt Seiten in einer engen Schleife zu bombardieren. Das Verteilen von Anfragen ist der wichtigste Faktor, um unter den Ratenlimits der Plattform zu bleiben.
  • Setzen Sie auf Rotation. Ein Pool residentieller IPs verteilt Anfragen auf viele echte Benutzeradressen, sodass keine einzelne ein Limit auslöst. Die Crawling API kümmert sich darum; wenn Sie Ihren eigenen Stack betreiben, ist das der Teil, den Sie richtig hinbekommen müssen.
  • Lesen Sie die Statuscodes. Ein Lauf, der beginnt, Herausforderungen oder Nicht-200-Antworten zurückzugeben, teilt Ihnen mit, dass die aktuelle Rate oder IP-Ebene nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückziehen, nicht als Rauschen, das Sie ignorieren.

Das breite Playbook finden Sie unter wie man Websites scrapt, ohne blockiert zu werden.

Ob das Scrapen von Product Hunt erlaubt ist, hängt von den Nutzungsbedingungen von Product Hunt, Ihrer Rechtsordnung und dem ab, was Sie mit den Daten tun. Die Bedingungen von Product Hunt beschränken den automatisierten Zugriff, daher kann das Scrapen gegen diese Bedingungen verstoßen, unabhängig davon, wie sorgfältig Ihr Tooling ist. Keiner der hier gezeigten Codes ändert das; er macht nur den technischen Teil funktionstüchtig. Lesen Sie die Nutzungsbedingungen von Product Hunt und seine robots.txt und behandeln Sie beide als Grenze für das, was Sie sammeln.

Einige Grundsätze, an die Sie sich halten sollten. Sammeln Sie nur öffentliche Produktdaten: die Namen, Taglines, Upvote-Anzahlen, Rezensionsanzahlen und Links, die jeder auf einer Kategorieseite ohne Konto sehen kann. Ernten Sie keine personenbezogenen Daten über Maker über die öffentlichen Profilgrundlagen hinaus, die auf der Seite angezeigt werden, und erstellen Sie niemals Profile, die auf Privatpersonen abzielen oder sie identifizieren. Respektieren Sie die angegebenen Ratenerwartungen von Product Hunt und halten Sie Ihr Anfragevolumen niedrig genug, dass Sie seine Server nicht belasten. Verteilen Sie keine urheberrechtlich geschützten Medien von Product Hunt, wie Produktbilder oder Maker-Avatare, als ob sie Ihre eigenen wären. Wenn Sie die Daten kommerziell wiederverwenden möchten, holen Sie sich die Erlaubnis oder eine offizielle Vereinbarung, anstatt Schweigen als Zustimmung zu interpretieren.

Für Volumen oder kommerziellen Einsatz betreibt Product Hunt eine offizielle API. Sie verwendet OAuth2-Token-Authentifizierung und wendet eigene Ratenlimits an, und der kommerzielle Einsatz ist standardmäßig eingeschränkt, also kontaktieren Sie Product Hunt vor dem Aufbau eines Unternehmens darauf. Diese offizielle API ist das richtige Werkzeug, wenn Sie große Volumen, garantierte Struktur oder kommerzielle Rechte benötigen. Diese Anleitung ist bewusst auf öffentliche Listings und grundlegende öffentliche Profilbasisdaten beschränkt, weil das die Grenze ist, die die Arbeit vertretbar macht. Sie deckt nichts hinter einem Login, private Benutzerdaten oder Versuche ab, die Authentifizierung zu umgehen. Wenn Ihr Projekt mehr als öffentliche Daten benötigt, ist die offizielle Product Hunt-API oder eine Datenvereinbarung der richtige Weg und kein ausgefeilterer Scraper.

Zusammenfassung

Wichtigste Erkenntnisse

  • Product Hunt rendert Listings clientseitig. Eine einfache Anfrage gibt eine leere Shell 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. Sie rendert die Seite mit dem JavaScript-Token, rotiert residentielle IPs und gibt fertiges HTML zurück, das Sie mit Cheerio parsen können.
  • Cheerio extrahiert die Felder. Wählen Sie jeden Produktcontainer aus, lesen Sie dann Name, Tagline, Upvotes, Reviews und Link heraus, leiten Sie den Rang vom Schleifenindex ab und erwarten Sie, dass die generierten Klassennamen driften.
  • Paginieren und exportieren. Gehen Sie durch Kategorieseiten, bis eine leer zurückkommt, schreiben Sie dann strukturierte Datensätze als JSON und CSV, und setzen Sie CSV-Felder in Anführungszeichen, damit komma-reiche Taglines intakt bleiben.
  • Bleiben Sie bei öffentlichen Daten. Respektieren Sie die Nutzungsbedingungen und robots.txt von Product Hunt, nehmen Sie nur grundlegende öffentliche Profilbasisdaten, niemals personenbezogene Daten, und bevorzugen Sie die offizielle Product Hunt-API für Volumen oder kommerziellen Einsatz.

Häufig gestellte Fragen

Welche Daten kann ich von Product Hunt scrapen?

Von einer öffentlichen Kategorieseite können Sie den Namen, die Tagline, die Upvote-Anzahl, den Rezensions-Anzahl-Text und den Link zum Listing jedes Produkts extrahieren. Von einem öffentlichen Maker-Profil können Sie grundlegende öffentliche Felder lesen wie den Anzeigenamen, die Überschrift, Follower- und Following-Anzahlen, Punkte und die Produkte, die der Maker ausgeliefert hat. Beschränken Sie die Sammlung auf diese öffentlichen Grunddaten und vermeiden Sie alles, was eine Privatperson über das hinaus identifiziert, was die Seite offen zeigt.

Warum gibt eine einfache Anfrage unvollständige Daten von Product Hunt zurück?

Weil Product Hunt seine Listings clientseitig mit JavaScript rendert und automatisierten Datenverkehr überwacht. Eine rohe HTTP-Anfrage von einer Datacenter-IP gibt normalerweise eine fast leere Shell statt der Produktkarten zurück. Um eine vollständige Seite zu erhalten, müssen Sie sie hinter einer vertrauenswürdigen IP rendern, was die Crawling API für Sie übernimmt, wenn Sie ihr JavaScript-Token verwenden.

Brauche ich das JavaScript-Token für Product Hunt?

Ja. Product Hunt baut seine Kategorie- und Profilseiten im Browser, also fordern Sie sie mit aktiviertem JavaScript-Rendering an, was im offiziellen Node-Client bedeutet, die Crawling API mit Ihrem JavaScript-Token zu initialisieren. Gerenderte Anfragen kosten mehr Credits als einfache, aber das kostenlose Kontingent ermöglicht Ihnen trotzdem, den vollständigen Ablauf zu testen, bevor Sie hochskalieren.

Meine Selektoren geben leere Werte zurück. Was hat sich geändert?

Höchstwahrscheinlich das Markup von Product Hunt. Seine generierten Klassennamen, die langen fontSize-*-Ketten und die gehashten styles_*-Klassen, ändern sich ohne Ankündigung, sodass Selektoren, die letzten Monat funktioniert haben, brechen können. Untersuchen Sie eine Live-Seite in den Entwicklertools Ihres Browsers und aktualisieren Sie die Selektoren. Regelmäßige Selektor-Wartung ist bei jedem Produktionsscraper normal.

Gibt es eine offizielle Product Hunt-API?

Ja. Product Hunt bietet eine offizielle API, die OAuth2-Token-Authentifizierung verwendet und Ratenlimits anwendet, wobei der kommerzielle Einsatz standardmäßig eingeschränkt ist, also fordern Sie die Genehmigung an, bevor Sie sie für geschäftliche Zwecke verwenden. Wenn Sie große Volumen, garantierte Struktur oder kommerzielle Rechte benötigen, ist die offizielle API der richtige Weg und nicht das Scrapen.

Wie vermeide ich Blockierungen beim Scrapen von Product Hunt?

Halten Sie Ihre Pro-IP-Anfragerate niedrig, fügen Sie Verzögerungen zwischen Seitenabfragen ein und leiten Sie durch rotierende residentielle IPs, damit keine einzelne Adresse ein Ratenlimit auslöst. Die Crawling API verwaltet Rotation und einen vertrauenswürdigen IP-Pool für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, in den Sie investieren sollten. Beobachten Sie die Statuscodes und ziehen Sie sich zurück, wenn Sie beginnen, Herausforderungen zu sehen.

Jetzt loslegen

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.

Self-Service · Kein Verkaufsgespräch erforderlich · Enterprise-Crawl-Volumen verfügbar