Baidu est le moteur de recherche dominant en Chine, l'endroit où la plupart des utilisateurs chinois se rendent en premier quand ils cherchent quelque chose. Ses résultats de recherche publics constituent donc un signal utile pour quiconque fait de la recherche de mots-clés, du suivi SEO, de l'analyse de marché, ou cherche simplement à comprendre ce qui se classe dans un marché que Google ne domine pas. La page de résultats porte les mêmes données structurées qu'un outil SERP veut partout ailleurs : titres, liens, extraits, et l'ordre dans lequel ils apparaissent.

Ce guide vous montre comment scraper les résultats de recherche Baidu avec Python de façon fiable. Vous construisez un scraper léger et exécutable qui récupère une page de résultats rendue via la Crawling API, parse chaque résultat avec BeautifulSoup, et imprime une sortie structurée propre. L'ensemble du tutoriel reste cantonné aux données publiques de résultats de recherche que tout le monde peut voir sans compte, et la section sur la légalité vers la fin n'est pas du remplissage, alors lisez-la avant de pointer ceci sur un volume réel.

Ce que vous allez construire

Un script Python qui prend l'URL publique d'une recherche Baidu, récupère le HTML via la Crawling API, et en extrait un enregistrement structuré pour chaque résultat organique de la page. Nous utiliserons une requête d'exemple comme fil rouge et récupérerons ces champs de chaque résultat :

  • Titre le texte d'en-tête du résultat, tel qu'il apparaît dans la liste.
  • Lien l'URL de destination vers laquelle pointe le résultat.
  • Extrait la description ou le résumé affiché sous le titre.
  • Position le rang du résultat sur la page, compté depuis le haut.

Pourquoi une simple requête échoue sur Baidu

Si vous tirez une requête HTTP nue sur une URL de résultats Baidu depuis un script, vous obtenez rarement la page propre que vous voyez dans votre propre navigateur. Deux choses jouent contre vous. D'abord, Baidu sert depuis l'intérieur de la Chine et adapte ce qu'il renvoie selon l'IP demandeuse, donc une adresse de datacenter étranger peut revenir avec un blocage régional ou un contenu partiel. Ensuite, Baidu guette le trafic automatisé : les requêtes qui ne ressemblent pas à un vrai navigateur sont défiées, reçoivent une page de vérification, ou sont bloquées avant d'atteindre les résultats.

Un scraper Baidu qui fonctionne a donc besoin de deux choses en une requête : une IP que la plateforme lit comme celle d'un vrai visiteur, et, quand la page s'appuie sur des scripts, un navigateur qui la rend. Vous pouvez assembler cela vous-même avec un navigateur sans interface plus un pool de proxies résidentiels rotatifs, mais les garder en bonne santé représente l'essentiel du travail. La Crawling API réunit les deux en un seul appel : vous lui envoyez l'URL, elle récupère depuis une IP résidentielle de confiance et rend quand il le faut, et elle vous renvoie un HTML fini à parser.

Pourquoi la rotation résidentielle compte ici

Baidu est géo-sensible d'une manière dont la plupart des cibles occidentales ne le sont pas. Une requête depuis une IP résidentielle ressemble à un visiteur ordinaire, tandis qu'une adresse de datacenter étranger est un signe immédiat. La Crawling API fait tourner des adresses résidentielles côté serveur, vous n'avez donc pas à sourcer et maintenir ce pool vous-même. Vous pouvez commencer avec jusqu'à 20 000 requêtes gratuites, sans carte de crédit.

Prérequis

Il vous faut quelques éléments en place avant d'écrire la moindre ligne de code. Aucun ne prend longtemps.

Python de base. Vous devez être à l'aise pour écrire et exécuter un script Python et installer des paquets avec pip. Si BeautifulSoup est nouveau pour vous, notre guide d'utilisation de BeautifulSoup en Python couvre les bases du parsing que suppose ce tutoriel.

Python 3.8 ou plus récent. Confirmez votre version avec python --version. Si vous ne l'avez pas, installez-le depuis python.org ou via une distribution comme Anaconda.

Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord, et copiez votre token de requête depuis la page docs de votre compte. Vous obtenez jusqu'à 20 000 requêtes gratuites : 1 000 à l'inscription, et davantage à mesure que vous complétez les étapes d'onboarding. Traitez le token comme un mot de passe : il authentifie vos requêtes, alors gardez-le hors du contrôle de version.

Configurer le projet

Créez un environnement virtuel pour que les dépendances du projet restent isolées, puis installez les deux bibliothèques dont le scraper a besoin.

bash
python --version

python -m venv baidu_env
source baidu_env/bin/activate

pip install requests beautifulsoup4

Sous Windows, activez l'environnement avec baidu_env\Scripts\activate au lieu de la ligne source. Deux dépendances font le travail : requests envoie l'appel HTTP à la Crawling API, et beautifulsoup4 parse le HTML renvoyé pour que vous puissiez extraire chaque champ par sélecteur CSS.

Étape 1 : Récupérer la page via la Crawling API

Commencez par obtenir le HTML. Écrivez une petite fonction crawl() qui envoie votre URL cible à la Crawling API avec votre token, vérifie que la page sous-jacente est revenue avec un statut 200, et renvoie le corps HTML. Vérifier le statut avant de parser garde les échecs bruyants plutôt que silencieux.

python
import json
import requests

API_TOKEN = "YOUR_CRAWLBASE_TOKEN"  # replace with your token
API_ENDPOINT = "https://api.crawlbase.com/"

def crawl(url):
    params = {"token": API_TOKEN, "url": url}
    response = requests.get(API_ENDPOINT, params=params)
    response.raise_for_status()

    data = json.loads(response.text)
    if data["original_status"] != 200:
        raise Exception(f"Unable to crawl '{url}'")

    return data["body"]

if __name__ == "__main__":
    url = "https://www.baidu.com/s?ie=utf-8&wd=%E8%8B%B9%E6%9E%9C%20iPhone"
    html = crawl(url)
    print(html[:500])

L'API renvoie une enveloppe JSON, vous chargez donc la réponse avec json.loads et lisez deux champs : original_status est le statut que Baidu lui-même a renvoyé, et body est le HTML de la page. Se protéger sur original_status signifie qu'un blocage régional ou un blocage remonte comme une exception au lieu de nourrir le parseur de déchets. La requête d'exemple est « 苹果 iPhone » (apple iPhone), encodée en URL dans le paramètre wd, qui est la façon dont Baidu porte le terme de recherche. Lancez le script avec python crawling.py et vous devriez voir un vrai balisage de résultats dans les 500 premiers caractères, ce qui confirme que la récupération fonctionne avant d'écrire le moindre sélecteur.

Crawlbase Crawling API

Ce contrôle original_status ne lit jamais que 200 parce que la requête a atteint Baidu comme un vrai visiteur en premier lieu. La Crawling API récupère la page depuis une IP résidentielle rotative dans la bonne région, la rend quand la page a besoin d'un navigateur, et vous remet un HTML fini : vous évitez ainsi de gérer une flotte sans interface et de sourcer vous-même un pool de proxies résidentiels. Pointez-la d'abord sur une URL de résultats publique avec l'offre gratuite.

Étape 2 : Parser les résultats avec BeautifulSoup

Avec le HTML en main, chargez-le dans BeautifulSoup et extrayez chaque résultat par son sélecteur. Baidu enveloppe chaque résultat organique dans un bloc de titre et lit le lien de destination depuis l'ancre qu'il contient. Inspectez la page en direct dans les outils de développement de votre navigateur (clic droit, puis Inspecter) pour confirmer les noms de classes actuels ; les sélecteurs ci-dessous correspondent à la mise en page au moment de la rédaction.

python
from bs4 import BeautifulSoup

def scrape_html(html):
    soup = BeautifulSoup(html, "html.parser")

    page_title = soup.title.string if soup.title else None
    search_input = soup.find("input", {"name": "wd"})
    search_query = search_input.get("value", "") if search_input else ""

    results = []
    for position, block in enumerate(soup.select("div.title-box_4YBsj"), start=1):
        heading = block.select_one("h3.t")
        link = block.select_one("a[href]")
        snippet = block.find_next("div", class_="content-right_2s-H4")
        if not heading or not link:
            continue
        results.append({
            "position": position,
            "title": heading.get_text(strip=True),
            "url": link["href"],
            "snippet": snippet.get_text(strip=True) if snippet else None,
        })

    return {
        "pageTitle": page_title,
        "searchQuery": search_query,
        "results": results,
    }

Le sélecteur div.title-box_4YBsj est le conteneur que Baidu utilise pour le bloc de titre de chaque résultat, avec l'en-tête dans une balise h3.t et la destination dans l'ancre qu'il contient. Lire le lien depuis le href de l'ancre garde l'URL séparée du titre. enumerate(..., start=1) vous donne la position gratuitement au fil de la boucle, donc le rang vient de l'ordre de la page plutôt que d'un attribut fragile. Le garde if not heading or not link: continue ignore tout ce qui n'est pas un vrai résultat organique, gardant les publicités et le balisage parasite hors de votre sortie. L'extrait est lu depuis le conteneur de description qui suit chaque titre, retombant sur None quand il est absent.

Les sélecteurs dérivent

Les noms de classes de Baidu, comme title-box_4YBsj et content-right_2s-H4, portent un suffixe généré qui change quand Baidu redéploie son front-end. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand un champ revient vide pour chaque résultat, réinspectez une page en direct dans les outils de développement de votre navigateur et mettez le sélecteur à jour. Une maintenance périodique des sélecteurs est normale pour tout scraper en production, pas le signe que quelque chose est cassé.

Étape 3 : Tout assembler

Reliez maintenant la récupération et le parsing en un seul script exécutable. Crawlez la page de résultats rendue, passez le HTML au parseur, et écrivez la sortie structurée en JSON. Définir ensure_ascii=False garde les caractères chinois lisibles dans le fichier au lieu de les échapper en séquences \u.

python
import json
import requests
from bs4 import BeautifulSoup

API_TOKEN = "YOUR_CRAWLBASE_TOKEN"
API_ENDPOINT = "https://api.crawlbase.com/"

def crawl(url):
    params = {"token": API_TOKEN, "url": url}
    response = requests.get(API_ENDPOINT, params=params)
    response.raise_for_status()
    data = json.loads(response.text)
    if data["original_status"] != 200:
        raise Exception(f"Unable to crawl '{url}'")
    return data["body"]

def scrape_html(html):
    soup = BeautifulSoup(html, "html.parser")
    page_title = soup.title.string if soup.title else None
    search_input = soup.find("input", {"name": "wd"})
    search_query = search_input.get("value", "") if search_input else ""

    results = []
    for position, block in enumerate(soup.select("div.title-box_4YBsj"), start=1):
        heading = block.select_one("h3.t")
        link = block.select_one("a[href]")
        snippet = block.find_next("div", class_="content-right_2s-H4")
        if not heading or not link:
            continue
        results.append({
            "position": position,
            "title": heading.get_text(strip=True),
            "url": link["href"],
            "snippet": snippet.get_text(strip=True) if snippet else None,
        })

    return {"pageTitle": page_title, "searchQuery": search_query, "results": results}

def main():
    url = "https://www.baidu.com/s?ie=utf-8&wd=%E8%8B%B9%E6%9E%9C%20iPhone"
    html = crawl(url)
    data = scrape_html(html)
    with open("baidu_results.json", "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print(f"Saved {len(data['results'])} results")

if __name__ == "__main__":
    main()

Lancez le script complet avec python main.py. Il récupère la page de résultats pour « 苹果 iPhone », extrait un enregistrement pour chaque résultat organique, et écrit tout dans baidu_results.json. Les deux mêmes fonctions sont tout ce dont vous avez besoin : changez la requête dans l'URL et le parseur gère tout ce qui revient.

À quoi ressemble la sortie

Vous obtenez un objet structuré propre avec le titre de la page, la requête de recherche reflétée, et une liste ordonnée de résultats, prêts à être écrits en JSON, CSV ou dans une base de données.

json
{
  "pageTitle": "苹果 iPhone_百度搜索",
  "searchQuery": "苹果 iPhone",
  "results": [
    {
      "position": 1,
      "title": "Apple (中国大陆) - 官方网站",
      "url": "http://www.baidu.com/link?url=abc123",
      "snippet": "探索 iPhone、iPad、Mac 等 Apple 产品的全新阵容。"
    },
    {
      "position": 2,
      "title": "iPhone - 维基百科",
      "url": "http://www.baidu.com/link?url=def456",
      "snippet": "iPhone 是苹果公司设计和销售的智能手机系列。"
    }
  ]
}

Notez que les URL de résultats reviennent sous forme de liens de redirection baidu.com/link?url=... plutôt que la destination finale. C'est ainsi que Baidu sert les clics sortants. Si vous avez besoin de la vraie cible, suivez chaque redirection avec une requête séparée, mais faites-le avec parcimonie et à faible volume pour ne pas multiplier votre trafic contre Baidu.

Passer à l'échelle sur les pages et les requêtes

Une requête sur une page est une démo ; un vrai travail s'exécute sur plusieurs recherches et plus profond dans les résultats. Baidu pagine avec le paramètre de requête pn, qui est un décalage en multiples de 10 : pn=10 est la deuxième page, pn=20 la troisième, et ainsi de suite. La forme reste la même : construisez chaque URL, récupérez-la via la Crawling API, et parsez-la avec la même fonction. La seule habitude qui garde une longue exécution saine est la cadence, alors faites une pause entre les requêtes plutôt que de les tirer dans une boucle serrée.

python
import time
from urllib.parse import quote

query = "苹果 iPhone"
encoded = quote(query)

all_results = []
for page in range(3):
    offset = page * 10
    url = f"https://www.baidu.com/s?ie=utf-8&wd={encoded}&pn={offset}"
    html = crawl(url)
    all_results.extend(scrape_html(html)["results"])
    time.sleep(3)

print(f"Collected {len(all_results)} results across 3 pages")

Crawlbase sert jusqu'à 20 requêtes par seconde par défaut, ce qui laisse amplement de marge à un scraper qui se cadence lui-même ; si vous avez réellement besoin de plus, le support peut l'augmenter. Toute réponse 5XX de l'API est gratuite, donc réessayer une URL bloquée ou indisponible ne vous coûte rien. Si vous préférez router votre propre trafic via un pool rotatif plutôt que d'utiliser l'API gérée, le Smart AI Proxy (aussi appelé l'AI Proxy) vous donne la même rotation d'IP résidentielles sous la forme d'un point de terminaison proxy prêt à l'emploi.

Rester débloqué

Même avec une IP de confiance prise en charge, Baidu guette le trafic en forme de scraper, et ses contrôles sont plus stricts que la plupart à cause de l'endroit où il opère. Quelques habitudes gardent une exécution saine.

  • Cadencez vos requêtes. Marteler les pages de résultats dans une boucle serrée est le moyen le plus rapide de se faire défier. Étalez les requêtes et variez vos requêtes plutôt que de paginer un seul terme à plein régime.
  • Appuyez-vous sur la rotation. Un pool d'IP résidentielles répartit les requêtes sur de nombreuses adresses de vrais utilisateurs pour qu'aucune seule ne déclenche une limite. La Crawling API s'en charge pour vous ; si vous montez votre propre pile, c'est la partie à bien faire.
  • Lisez les codes de statut. Une exécution qui se met à renvoyer des défis ou des pages de vérification vous dit que le débit ou le palier d'IP actuel ne suffit plus. Traitez cela comme un signal pour lever le pied, pas comme un bruit à ignorer.
  • Réinspectez quand des champs deviennent vides. Baidu change son balisage périodiquement. Si les résultats cessent de se parser, ouvrez une page en direct dans les outils de développement et mettez les sélecteurs à jour.

Pour le manuel plus large, voyez comment scraper des sites web sans se faire bloquer et l'analyse plus poussée sur comment contourner les captchas en web scraping. Si une page Baidu dont vous avez besoin s'appuie sur des scripts pour se rendre, notre guide sur le crawl des sites web JavaScript explique pourquoi le rendu compte et comment l'activer.

Est-il légal de scraper Baidu ?

Que le scraping de Baidu soit autorisé dépend des conditions d'utilisation de Baidu, de votre juridiction et de ce que vous faites des données. Les conditions de Baidu posent des limites à l'accès automatisé, donc le scraping peut aller à l'encontre de ces conditions quel que soit le soin apporté à votre outillage. Aucun code ici ne change cela ; il fait juste fonctionner la partie technique. Lisez les conditions de Baidu et son robots.txt, et traitez les deux comme la limite de ce que vous collectez.

Quelques lignes à respecter. Ne collectez que des données publiques de résultats de recherche : les titres, liens, extraits et positions que tout le monde peut voir sur une page de résultats sans compte. Gardez votre volume de requêtes assez bas pour ne pas solliciter les serveurs de Baidu, et cadencez votre crawl plutôt que de le lancer à plein régime. Baidu ne publie pas d'API SERP officielle largement disponible pour ce type d'accès, il n'y a donc pas de point de terminaison sanctionné à haut volume sur lequel se rabattre, ce qui est une raison de plus de rester modeste en échelle et respectueux des règles énoncées du site.

Ce guide est délibérément cantonné aux pages publiques de résultats de recherche car c'est la ligne qui garde le travail défendable. Il ne couvre rien derrière une connexion, ni les données de compte ou personnelles, ni les médias protégés par droit d'auteur tirés des destinations liées. Données SERP publiques uniquement. Si votre projet a besoin de plus que cela, un accord de données officiel est la voie correcte, pas un scraper plus astucieux.

Récapitulatif

Points clés

  • Baidu est géo-sensible. Une IP de datacenter étranger reçoit une page différente ou un blocage, vous avez donc besoin d'une adresse résidentielle de confiance pour voir les vrais résultats.
  • La Crawling API récupère derrière une vraie IP. Envoyez-lui l'URL, elle fait tourner des IP résidentielles côté serveur et rend quand il le faut, et renvoie un HTML fini à parser.
  • BeautifulSoup fait l'extraction. Sélectionnez chaque div.title-box_4YBsj, puis lisez-en le titre, le lien, l'extrait et la position, et attendez-vous à ce que les noms de classes suffixés dérivent.
  • Paginez avec le décalage pn. Augmentez pn en multiples de 10 pour aller plus profond dans les résultats, et cadencez vos requêtes avec un sleep entre les pages.
  • Restez sur les données publiques. Respectez les CGU et le robots.txt de Baidu, gardez le volume bas puisqu'il n'y a pas d'API SERP officielle ouverte, et ne touchez jamais aux comptes ni aux données personnelles.

Foire aux questions

Pourquoi une simple requête échoue-t-elle ou renvoie-t-elle la mauvaise page sur Baidu ?

Baidu sert depuis l'intérieur de la Chine et ajuste ce qu'il renvoie selon l'IP demandeuse, donc un appel depuis une adresse de datacenter étranger peut revenir avec un blocage régional, un contenu partiel ou une page de vérification au lieu des résultats que vous voyez dans votre propre navigateur. Il signale aussi le trafic qui ne ressemble pas à un vrai navigateur. Récupérer via la Crawling API, qui utilise des IP résidentielles rotatives, fait ressembler la requête à un visiteur ordinaire pour que vous obteniez la vraie page de résultats.

Puis-je scraper les résultats de recherche Baidu avec Python ?

Oui. Avec requests et BeautifulSoup vous pouvez récupérer une page de résultats et en extraire les titres, liens, extraits et positions. La Crawling API agit comme le pont qui amène votre requête à Baidu depuis une IP de confiance, donc les requêtes sont traitées sans accroc au lieu d'être bloquées. Pour une introduction Python plus large, voyez notre guide sur le scraping de sites web avec Python.

Quels champs puis-je extraire d'une page de résultats Baidu ?

Ce tutoriel extrait quatre champs de chaque résultat organique : le titre, le lien de destination, l'extrait affiché et la position sur la page. Vous capturez aussi le titre de la page et la requête de recherche reflétée depuis le champ wd. Tenez-vous-en aux données publiques de résultats de recherche et évitez tout ce qui est derrière une connexion.

Ai-je besoin du rendu JavaScript pour scraper Baidu ?

Généralement les résultats principaux se chargent sans lui, donc la récupération de base de ce guide suffit. Si vous tombez sur une page qui a besoin d'un navigateur pour se remplir, la Crawling API offre une option de rendu JavaScript qui récupère la page comme le ferait un vrai navigateur. Notre guide du scraping de pages JavaScript avec Python couvre quand c'est nécessaire.

Comment paginer dans plus de résultats Baidu ?

Utilisez le paramètre de requête pn, qui est un décalage en multiples de 10 : pn=10 est la deuxième page, pn=20 la troisième, et ainsi de suite. Construisez chaque URL de page avec le décalage, récupérez-la via la Crawling API, parsez-la avec la même fonction, et faites une pause de quelques secondes entre les requêtes pour cadencer le crawl plutôt que de le marteler.

Mes sélecteurs ne renvoient rien. Qu'est-ce qui a changé ?

Presque certainement le balisage de Baidu. Des noms de classes comme title-box_4YBsj portent un suffixe généré qui change quand Baidu redéploie son front-end, donc des sélecteurs qui marchaient le mois dernier peuvent casser. Réinspectez une page de résultats en direct dans les outils de développement de votre navigateur et mettez les sélecteurs à jour. Une maintenance périodique des sélecteurs est normale pour tout scraper en production.

Commencer à construire

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.

En libre-service · Sans appel commercial requis · Volumes de crawl entreprise disponibles