Temu est une place de marché en pleine croissance, reconnue pour son vaste catalogue à des prix agressifs, couvrant l'électronique, la mode et les produits pour la maison. Ses pages de recherche et de listing portent exactement les signaux publics qui intéressent les détaillants, les analystes et les suiveurs de prix : le nom du produit, son prix actuel, les avis des acheteurs et le nombre d'unités déjà vendues. Lus ensemble sur une catégorie, ces champs révèlent ce qui est tendance et l'évolution des prix.
Ce guide vous montre comment scraper Temu avec JavaScript et Node.js en utilisant cheerio. Vous construisez un scraper minimal et fonctionnel qui récupère une page de résultats de recherche Temu via la Crawling API, analyse le titre, le prix, la note, le nombre de ventes et le lien de chaque produit, gère la pagination via le bouton « Voir plus » et exporte le résultat en JSON et CSV. L'ensemble du tutoriel se limite aux données de listing de produits publics, et la section juridique en fin d'article n'est pas du remplissage, donc lisez-la avant de viser des volumes réels.
Ce que vous allez construire
Un script Node.js qui prend une URL de recherche publique Temu, récupère le HTML rendu via la Crawling API et extrait un enregistrement structuré pour chaque produit du listing. Nous utilisons une requête de recherche générique comme exemple fil rouge et extrayons ces champs par article :
- Titre le nom du produit affiché sur la carte, utilisé pour identifier l'article et sa catégorie.
- Prix le texte du prix tel qu'affiché, pour le suivi des tendances et la comparaison de produits similaires.
- Note la note en étoiles affichée sur la carte, un indicateur rapide du sentiment client.
- Nombre de ventes le chiffre « N vendu(s) » que Temu affiche sur de nombreuses cartes, un signal approximatif de la demande.
- URL de l'image la vignette du produit, pour une base de données visuelle ou une application en aval.
- Lien l'URL vers la page produit individuelle, pour approfondir ultérieurement.
Pourquoi une requête classique échoue sur Temu
Si vous demandez une URL de recherche Temu avec un client HTTP basique, vous obtenez rarement la grille de produits en retour. Deux facteurs jouent contre vous. Premièrement, Temu rend ses cartes de listing dans le navigateur avec JavaScript, donc le HTML initial est une coquille quasi vide jusqu'à ce que les scripts de la page s'exécutent et que la liste des produits se charge. Deuxièmement, Temu challenge agressivement le trafic automatisé : les IP de datacenter et les patterns de requêtes qui ne ressemblent pas à un vrai navigateur reçoivent un CAPTCHA, sont limités en débit ou bloqués avant même d'atteindre les données de produits rendus.
Un scraper Temu fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend réellement la page, et une IP que la plateforme perçoit comme un vrai visiteur. Vous pouvez assembler cela vous-même avec un navigateur headless et un pool de proxies résidentiels rotatifs, mais assembler ces éléments et les maintenir opérationnels représente la majeure partie du travail. La Crawling API regroupe les deux dans un seul appel : vous lui envoyez l'URL, elle rend la page derrière une IP de confiance et vous renvoie le HTML finalisé à analyser avec cheerio. Comme la liste des produits est chargée par des scripts côté client, vous demandez à l'API d'attendre ce contenu avant de répondre.
Le scraping de contenu rendu par JavaScript comme celui de Temu nécessite le token de requête JavaScript de votre tableau de bord Crawlbase, et non le token classique. Le niveau gratuit inclut jusqu'à 5 000 requêtes sans carte bancaire, et vous ne payez que pour les requêtes réussies. Consultez les tarifs pour savoir comment les requêtes normales et JavaScript sont créditées.
Prérequis
Quelques éléments doivent être en place avant d'écrire le moindre code. Aucun ne prend longtemps.
Notions de base en JavaScript et Node.js. Vous devez être à l'aise pour écrire et exécuter un script Node et installer des packages avec npm. Si vous débutez avec Node, la documentation officielle ou n'importe quel cours pour débutants vous amènera au niveau que ce tutoriel suppose.
Node.js 16 ou supérieur. Confirmez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site de Node.js ou via un gestionnaire de versions comme nvm.
Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token de requête JavaScript depuis la page de documentation du compte. Traitez le token comme un mot de passe : il authentifie vos requêtes, donc gardez-le hors du contrôle de version.
Configurer le projet
Créez un dossier de projet, initialisez-le et installez les deux bibliothèques dont le scraper a besoin.
node --version mkdir temu-scraper && cd temu-scraper npm init -y npm install crawlbase cheerio
Deux dépendances font le travail : crawlbase est le client Node officiel pour la Crawling API, et cheerio analyse le HTML retourné avec une API de style jQuery pour que vous puissiez extraire chaque champ par sélecteur CSS. Créez un fichier nommé temu-scraper.js dans ce dossier et ajoutez le code des étapes ci-dessous.
Étape 1 : récupérer la page de recherche rendue
Commencez par obtenir la page finalisée. Importez la classe CrawlingAPI, initialisez-la avec votre token JavaScript et demandez l'URL de recherche. Temu charge sa liste de produits avec des scripts côté client, donc passez ajax_wait et un délai page_wait pour laisser le temps à ce contenu d'apparaître avant que l'API réponde. Vérifier le code de statut avant d'analyser permet de détecter les erreurs clairement plutôt qu'en silence.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const searchURL = 'https://www.temu.com/search_result.html?search_key=wireless+earbuds'; const options = { ajax_wait: 'true', page_wait: '5000' }; api .get(searchURL, options) .then((response) => { if (response.statusCode === 200) { console.log(response.body.slice(0, 500)); } }) .catch((error) => console.error('API request error:', error));
Exécutez le script avec node temu-scraper.js et vous devriez voir le vrai balisage produit Temu en haut du body, et non une coquille vide. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur. L'indicateur ajax_wait demande à l'API d'attendre que les requêtes internes à la page se stabilisent, et page_wait ajoute un délai fixe en millisecondes, ce qui ensemble donne le temps à la liste des produits de se peupler.
Cette première requête vient de retourner une page de recherche Temu entièrement rendue sans navigateur headless ni proxy de votre côté. La Crawling API exécute la page dans un vrai navigateur, attend que la liste JavaScript des produits se charge, fait tourner les IPs résidentielles côté serveur et gère les CAPTCHAs que Temu envoie aux scrapers, pour que vous obteniez le HTML finalisé en un seul appel. Pointez-la sur une requête de recherche avec le niveau gratuit d'abord.
Étape 2 : analyser chaque produit avec cheerio
Avec le HTML rendu en main, chargez-le dans cheerio et parcourez les cartes produit. Temu dispose chaque résultat de recherche dans un conteneur répétitif à l'intérieur de la liste des produits, donc vous sélectionnez chaque carte, puis lisez le titre, le prix, la note, le nombre de ventes, l'image et le lien depuis l'intérieur. Lire chaque champ de façon défensive évite qu'une valeur manquante fasse planter l'exécution.
const cheerio = require('cheerio'); function parseSearchResults(html) { const $ = cheerio.load(html); const products = []; const cards = $( 'div.js-search-goodsList > div.autoFitList > div.EKDT7a3v' ); cards.each((index, element) => { const card = $(element); const title = card.find('h2._2BvQbnbN').text().trim(); const price = card.find('span._2de9ERAH').text().trim(); const rating = card.find('div._1bGyLOoB').text().trim(); const sold = card.find('span._3VxQjs6a').text().trim(); const imageUrl = card.find('img.goods-img-external').attr('src') || ''; const href = card.find('a._2Tl9qLr1').attr('href'); const link = href ? new URL(href, 'https://www.temu.com').href : ''; if (title) { products.push({ title, price, rating, sold, imageUrl, link }); } }); return products; }
Quelques détails assurent la fidélité à la page. Chaque carte se trouve sous div.js-search-goodsList > div.autoFitList > div.EKDT7a3v, le titre vient du titre h2._2BvQbnbN, le prix de span._2de9ERAH, la note et le nombre de ventes de leurs propres nœuds texte, la vignette du src de img.goods-img-external et le lien du href de a._2Tl9qLr1, résolu en URL absolue pour fonctionner hors de la page. La garde if (title) élimine les cellules de remplacement vides qui se glissent parfois dans la grille.
Les noms de classe de Temu (_2BvQbnbN, _2de9ERAH, EKDT7a3v et autres) sont générés et changent sans préavis. Considérez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Lorsqu'un champ revient vide, ré-inspectez la page live dans les outils de développement de votre navigateur et mettez à jour le sélecteur. La maintenance périodique des sélecteurs est normale pour tout scraper de production, ce n'est pas le signe que quelque chose est cassé.
Étape 3 : gérer la pagination et assembler le script complet
Temu charge plus de résultats derrière un bouton « Voir plus » plutôt que sur des pages numérotées séparées. La Crawling API peut cliquer ce bouton pour vous avant de renvoyer le HTML, via l'option css_click_selector, donc un seul rendu peut afficher un plus grand lot de cartes. Câblez la récupération, le clic et l'analyse dans un script fonctionnel, puis écrivez les enregistrements sur disque en JSON et CSV.
const fs = require('fs'); const { CrawlingAPI } = require('crawlbase'); const cheerio = require('cheerio'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); async function crawl(url) { const response = await api.get(url, { ajax_wait: 'true', page_wait: '5000', css_click_selector: 'div.R8mNGZXv[role="button"]', }); if (response.statusCode === 200) return response.body; console.error(`Request failed: ${response.statusCode}`); return null; } function toCsv(rows) { const headers = ['title', 'price', 'rating', 'sold', 'imageUrl', '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.temu.com/search_result.html?search_key=wireless+earbuds'; const html = await crawl(url); if (!html) return; const products = parseSearchResults(html); fs.writeFileSync('temu-products.json', JSON.stringify(products, null, 2)); fs.writeFileSync('temu-products.csv', toCsv(products)); console.log(`Saved ${products.length} products to JSON and CSV`); } main();
Collez la fonction parseSearchResults de l'étape 2 dans le même fichier pour que main puisse l'appeler. Le css_click_selector pointe sur le contrôle « Voir plus » de Temu (div.R8mNGZXv[role="button"]) ; l'API clique dessus pendant le rendu pour que le HTML retourné inclue les cartes supplémentaires que ce clic charge. Exécutez le script avec node temu-scraper.js et vous obtenez deux fichiers : temu-products.json avec les enregistrements structurés complets et temu-products.csv prêt à ouvrir dans un tableur. Le helper toCsv met chaque champ entre guillemets et double les guillemets intégrés, ce qui est important ici car les titres de produits sont longs et contiennent fréquemment des virgules.
À quoi ressemble la sortie
Le fichier JSON contient un objet par produit dans l'ordre du listing, chacun avec le titre, le prix, la note, le nombre de ventes, l'URL de l'image et le lien.
[ { "title": "Wireless Earbuds Bluetooth 5.3 with Charging Case", "price": "$8.97", "rating": "4.6", "sold": "12K+ sold", "imageUrl": "https://img.kwcdn.com/product/open/earbuds-001.jpg", "link": "https://www.temu.com/goods-detail-g-601099527865713.html" }, { "title": "True Wireless Sports Earphones Noise Cancelling", "price": "$11.49", "rating": "4.4", "sold": "3.2K+ sold", "imageUrl": "https://img.kwcdn.com/product/open/earbuds-002.jpg", "link": "https://www.temu.com/goods-detail-g-601099537192760.html" } ]
Le CSV reflète les mêmes lignes avec une ligne d'en-tête, il peut donc être directement importé dans Excel, Google Sheets ou tout pipeline de données qui lit des fichiers délimités.
title,price,rating,sold,imageUrl,link "Wireless Earbuds Bluetooth 5.3 with Charging Case","$8.97","4.6","12K+ sold","https://img.kwcdn.com/product/open/earbuds-001.jpg","https://www.temu.com/goods-detail-g-601099527865713.html" "True Wireless Sports Earphones Noise Cancelling","$11.49","4.4","3.2K+ sold","https://img.kwcdn.com/product/open/earbuds-002.jpg","https://www.temu.com/goods-detail-g-601099537192760.html"
Passer à l'échelle sur plusieurs requêtes et rester non bloqué
Une seule requête de recherche est une démonstration ; un vrai travail parcourt plusieurs requêtes ou catégories. Constituez une liste de termes de recherche, récupérez chacun via la Crawling API avec les mêmes options d'attente et de clic, analysez-le avec la même fonction et taguez chaque ligne avec sa requête avant d'exporter. Comme chaque page de recherche partage la même structure de carte, le parser que vous avez déjà écrit fonctionne sur toutes sans modification.
async function scrapeQueries(queries) { const all = []; for (const query of queries) { const term = encodeURIComponent(query); const url = `https://www.temu.com/search_result.html?search_key=${term}`; const html = await crawl(url); if (!html) continue; const rows = parseSearchResults(html).map((p) => ({ query, ...p })); all.push(...rows); await new Promise((r) => setTimeout(r, 2000)); } return all; } scrapeQueries(['wireless earbuds', 'phone case', 'led lights']).then((rows) => { console.log(`Collected ${rows.length} products across queries`); });
Même avec le rendu géré, Temu surveille le trafic ressemblant à un scraper, donc quelques habitudes maintiennent une exécution saine. Cadencez vos requêtes : le délai setTimeout entre les requêtes ci-dessus étale le trafic plutôt que de marteler les pages en boucle serrée, ce qui est le facteur le plus important pour rester sous les limites de débit. Misez sur la rotation : un pool d'IPs résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels afin qu'aucune seule ne déclenche une limite ou un CAPTCHA, et la Crawling API s'en charge pour vous. Lisez les codes de statut : une exécution qui commence à retourner des réponses non-200 vous signale de ralentir, ce n'est pas du bruit à ignorer. Pour le guide complet, consultez comment scraper des sites web sans se faire bloquer, et pour la partie rendu spécifiquement, comment crawler des sites JavaScript.
Ce pattern s'applique directement aux travaux de pricing et de recherche. Pour transformer des données de listing en décisions de prix, consultez comment utiliser le web scraping pour l'intelligence des prix, et pour le panorama plus large du scraping de places de marché, le guide sur le web scraping e-commerce couvre des patterns qui réutilisent la même approche récupération-puis-analyse sur d'autres boutiques.
Est-il légal de scraper Temu ?
La légalité du scraping de Temu dépend des conditions d'utilisation de Temu, de votre juridiction et de ce que vous faites des données. Les conditions de Temu restreignent l'accès automatisé, donc le scraping peut aller à l'encontre de ces conditions quel que soit le soin apporté à vos outils. Aucun code ici ne change cela ; il rend simplement la partie technique fonctionnelle. Lisez les Conditions d'utilisation de Temu et son fichier robots.txt, et traitez les deux comme la frontière de ce que vous collectez.
Quelques règles à respecter. Collectez uniquement les données publiques des produits : le titre, le prix, la note, le nombre de ventes, l'image et le lien produit que quiconque peut voir sur une page de recherche sans compte. Respectez les attentes de débit de Temu et gardez votre volume de requêtes suffisamment bas pour ne pas surcharger ses serveurs. Évitez les données personnelles, notamment tout ce qui est lié à des évaluateurs identifiables au-delà des notes et comptages agrégés affichés sur la page. Ne redistribuez pas les médias protégés par le droit d'auteur de Temu, comme sa photographie de produit, comme s'ils vous appartenaient ; traiter une URL d'image comme référence est différent de l'hébergement commercial de l'image.
Ce guide est délibérément limité aux données publiques de recherche et de listing, car c'est la ligne qui rend le travail défendable. Il ne couvre rien derrière une connexion, aucune donnée personnelle de client ou de vendeur, aucun historique de commande ni aucune tentative de contourner une authentification ou un CAPTCHA que vous n'étiez pas censé passer. Si votre projet a besoin de plus que des listings publics, ou si vous prévoyez de réutiliser les données à des fins commerciales, la bonne voie est un accord officiel ou un programme partenaire ou affilié sanctionné, pas un scraper plus sophistiqué. Quand une place de marché offre un canal de données officiel, préférez-le pour un volume important ou un usage commercial.
Points clés
- Temu rend les listings côté client et bloque fortement. Une requête simple retourne une coquille vide ou un CAPTCHA, vous devez donc rendre la page derrière une IP de confiance et attendre la liste des produits avant de l'analyser.
-
La Crawling API fait le gros du travail en un seul appel. Elle rend la page, attend le contenu AJAX avec
ajax_waitetpage_wait, fait tourner les IPs résidentielles et gère les CAPTCHAs, retournant le HTML finalisé. - cheerio extrait les champs. Sélectionnez chaque carte sous la liste des produits, puis lisez le titre, le prix, la note, le nombre de ventes, l'image et le lien, et anticipez la dérive des noms de classes générés.
-
La pagination est un clic sur « Voir plus ». Temu charge plus de résultats derrière un bouton, donc
css_click_selectordemande à l'API de cliquer dessus pendant le rendu et de retourner le lot plus grand. - Restez sur les données publiques. Respectez les CGU et le robots.txt de Temu, cadencez vos requêtes, évitez les données personnelles et le contenu derrière connexion, et exportez du JSON et CSV propres pour une utilisation en aval.
Foire aux questions
Pourquoi une requête simple retourne-t-elle des données incomplètes depuis Temu ?
Parce que Temu rend sa grille de produits côté client avec JavaScript et challenge le trafic automatisé avec des CAPTCHAs. Une requête HTTP brute depuis une IP de datacenter retourne généralement une coquille vide ou une page de blocage plutôt que les cartes produit. Pour obtenir une page complète, vous devez la rendre derrière une IP de confiance et attendre que la liste des produits se charge, ce que la Crawling API gère pour vous avec ajax_wait et page_wait.
Ai-je besoin du token JavaScript pour scraper Temu ?
Oui. Le contenu de Temu est rendu par JavaScript, donc vous utilisez le token de requête JavaScript de votre tableau de bord Crawlbase plutôt que le token classique, et vous passez les options d'attente pour que la liste des produits rendue soit présente dans la réponse. Le niveau gratuit inclut jusqu'à 5 000 requêtes sans carte bancaire, et les requêtes JavaScript sont créditées différemment des requêtes normales, donc vérifiez la page de tarification pour les détails.
Comment fonctionne la pagination sur Temu ?
Temu charge plus de listings derrière un bouton « Voir plus » plutôt que sur des pages numérotées séparées. La Crawling API peut cliquer ce bouton pendant le rendu via l'option css_click_selector, donc une seule requête peut retourner un lot plus grand de cartes. Pointez le sélecteur sur le bouton (par exemple div.R8mNGZXv[role="button"]) et les résultats supplémentaires reviennent dans le même HTML que vous analysez.
Mes sélecteurs retournent des valeurs vides. Qu'est-ce qui a changé ?
Très probablement le balisage de Temu. Son conteneur et ses noms de classes comme _2BvQbnbN, _2de9ERAH et EKDT7a3v sont générés et changent sans préavis, donc des sélecteurs qui fonctionnaient le mois dernier peuvent être cassés. Ré-inspectez une page live dans les outils de développement de votre navigateur et mettez à jour les sélecteurs. La maintenance périodique des sélecteurs est normale pour tout scraper de production.
Puis-je stocker les données Temu dans une base de données plutôt qu'en CSV ?
Oui. Le CSV et le JSON sont pratiques pour un premier passage, mais pour des projets plus importants ou continus, une base de données comme PostgreSQL ou MongoDB facilite l'interrogation et l'analyse des données dans le temps. Remplacez les appels writeFileSync dans main par la logique d'insertion de votre client de base de données et gardez le reste du scraper inchangé.
Comment éviter d'être bloqué en scrapant Temu ?
Gardez votre taux de requêtes par IP bas, ajoutez des délais entre les requêtes et routez via des IPs résidentielles rotatives pour qu'aucune adresse unique ne déclenche une limite de débit ou un CAPTCHA. La Crawling API gère la rotation, un pool d'IPs de confiance et la gestion des CAPTCHAs pour vous ; si vous construisez votre propre stack, c'est la partie sur laquelle investir. Surveillez les codes de statut et ralentissez dès que vous commencez à voir des challenges.
Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.
Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.
