Retour au blog
Les techniques de web scraping
Mihai Maxim3 mars 202311 min de lecture

Questions fréquentes sur le web scraping - Réponses et conseils

Questions fréquentes sur le web scraping - Réponses et conseils

Pourquoi mon scraper ne voit-il pas les mêmes données que mon navigateur ?

Vous avez écrit un script pour récupérer du code HTML depuis un site web, mais vous n'obtenez pas toutes les données. Vous avez testé vos sélecteurs dans le navigateur et ils devraient fonctionner, n'est-ce pas ? Pas toujours. Les sites web qui s'appuient sur JavaScript pour s'afficher ne fonctionneront pas avec une simple requête GET. Il existe des bibliothèques telles que Puppeteer et Selenium qui utilisent des navigateurs sans interface graphique pour exécuter le JavaScript. Elles vous permettent d'effectuer la requête dans le contexte d'un navigateur et d'attendre que l'exécution du JavaScript soit terminée. De cette façon, vous pouvez récupérer l'intégralité du code HTML. Vous n'aurez pas toujours besoin d'un navigateur sans interface graphique pour récupérer les données manquantes. Recherchez les balises <script> dans le code HTML. Les données manquantes pourraient être cachées à l'intérieur de ces balises sous forme de variables JavaScript.

Comment puis-je extraire les données d&#x27;un site web qui utilise des classes CSS générées ?

Certains sites web utilisent des bibliothèques qui créent automatiquement des noms de classes uniques pour différents composants de la page. Cela peut rendre difficile l'utilisation de sélecteurs CSS traditionnels pour cibler des éléments spécifiques.

Une solution consiste à utiliser des expressions XPath à la place. Les sélecteurs XPath s'appuient sur la mise en page de la page, plutôt que sur des noms de classes spécifiques. Cela signifie que même si les noms de classes changent, le sélecteur XPath sera toujours capable de localiser l'élément souhaité.

Par exemple, si vous avez un composant HTML qui ressemble à ceci :

<div class="container">

    <div class="subcontainer_af21">

        <ul class="ul_ax1">

            <li class="li_adef">

                <a href="https://link1">Winter Storm</a>

            </li>

        </ul>

        <ul class="ul_cgt4">

            <li class="li_ocv2">

                <a href="https://lin2">SpaceX</a>

            </li>

        </ul>

    </div>

</div>

Vous pouvez sélectionner le deuxième élément <a> avec :

//div[@class='container']/div/ul[2]/li/a

Cheerio est-il plus rapide que Puppeteer ?

Oui, Cheerio est généralement considéré comme plus rapide que Puppeteer. En effet, Cheerio est une bibliothèque côté serveur qui travaille directement avec le contenu HTML. Puppeteer est une bibliothèque d'automatisation de navigateur qui contrôle un navigateur sans interface graphique pour charger des pages web et interagir avec elles. Cheerio est limité dans le sens où il ne peut fonctionner qu'avec des pages statiques ; il n'a pas la capacité d'interagir avec le navigateur comme le fait Puppeteer

Les sélecteurs XPath sont-ils meilleurs que les sélecteurs CSS ?

Cela dépend du contexte. Si vous cherchez à extraire des données en fonction de la position des éléments, XPath est le meilleur choix. En revanche, si vous cherchez à extraire des données en fonction de propriétés telles que la classe ou l'identifiant, les sélecteurs CSS constituent une meilleure option.

Playwright est-il meilleur que Puppeteer ?

Les deux offrent des fonctionnalités similaires, mais Playwright prend en charge plusieurs navigateurs, notamment Chrome, Firefox et Safari. Puppeteer ne prend en charge que Chrome et Chromium.

Playwright offre une meilleure prise en charge pour travailler avec plusieurs onglets et fenêtres. Il intègre également une prise en charge native de la gestion des contextes de navigateur, des cookies et du stockage. Playwright est mieux adapté aux projets complexes.

Comment éviter les interdictions d&#x27;IP ?

En général, vous pouvez essayer d'espacer vos requêtes. Utilisez différentes adresses IP. Utilisez des proxys. Essayez de modifier l'empreinte du navigateur. Pour la plupart des gens, c'est une bataille sans fin. La bonne nouvelle, c'est que cela ne doit pas nécessairement être le cas. Vous pouvez utiliser notre solution, WebScrapingAPI. WebScrapingAPI fournit une API qui se chargera de tout le travail fastidieux à votre place. Elle peut exécuter du JavaScript, faire tourner les proxys et même gérer les CAPTCHA. Vous n'aurez plus jamais à vous soucier d'un blocage de votre adresse IP. Mais ne nous croyez pas sur parole. Vous pouvez l'essayer gratuitement.

Comment extraire du texte d&#x27;un fichier HTML avec BeautifulSoup ?

Vous pouvez utiliser la bibliothèque BeautifulSoup. Voici un exemple d'extraction de texte à l'aide de la fonction .get_text() :

from bs4 import BeautifulSoup

html_doc = """

<html>

 <head>

   <title>title of the page</title>

 </head>

 <body>

   <p>a paragraph</p>

   <a href='https://link.com'>a link</a>

 </body>

</html>

"""

soup = BeautifulSoup(html_doc, 'html.parser')

paragraph_text = soup.find('p').text

print(paragraph_text)

#Prints 'a paragraph'

link_text = soup.find('a').text

print(link_text)

#Prints 'a link'

all_text = soup.get_text()

print(all_text)

"""

title of the page

a paragraph

a link

"""

Comment extraire du texte d&#x27;un fichier HTML avec Selenium ?

Voici comment procéder dans Selenium :

from selenium import webdriver

from selenium.webdriver.common.by import By

DRIVER_PATH = 'path/to/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.get("https://en.wikipedia.org/wiki/Main_Page")

# get all the h2 elements

content = driver.find_element(By.TAG_NAME, "h2")

print(content.text)

# Prints 'From today's featured article'

Comment sélectionner des éléments HTML par texte avec BeautifulSoup ?

Avec BeautifulSoup, vous pouvez utiliser la méthode soup.find avec le paramètre text=re.compile("<text>") :

from bs4 import BeautifulSoup

import re

html_doc = """

<html>

<body>

  <p class="my_paragraph">a paragraph.</p>

  <p class="my_paragraph">another paragraph.</p>

</body>

</html>

"""

soup = BeautifulSoup(html_doc, 'html.parser')

# find the first pTag that contains the text 'a par'

pTag = soup.find("p", text=re.compile("a par"))

print(pTag)

Comment sélectionner des éléments HTML par texte avec Selenium ?

Dans Selenium, vous pouvez le faire avec XPath :

from selenium import webdriver

from selenium.webdriver.common.by import By

DRIVER_PATH = 'path/to/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.get("https://en.wikipedia.org/wiki/Main_Page")

# get all the elements with class vector-body

span = driver.find_element(By.XPATH, "//span[contains(text(), 'Did')]")

print(span.text)

# Prints 'Did you know ...'

driver.quit()

Comment trouver des éléments HTML avec des sélecteurs CSS dans BeautifulSoup ?

Voici comment procéder avec BeautifulSoup et les méthodes find et find_all :

from bs4 import BeautifulSoup

html_doc = """

<html>

  <body>

    <p class="my_paragraph">First paragraph.</p>

    <p class="my_paragraph">Second paragraph..</p>

    <p>Last paragraph.</p>

  </body>

</html>

"""

soup = BeautifulSoup(html_doc, 'html.parser')

# find all elements with class 'my_paragraph

elements = soup.find_all(class_="my_paragraph")

for element in elements:

    print(element.text)

# prints 'First paragraph.' and 'Second paragraph..'

Comment trouver des éléments HTML par classe avec Selenium ?

Voici comment procéder avec Selenium :

from selenium import webdriver

from selenium.webdriver.common.by import By

DRIVER_PATH = 'path/to/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.get("https://en.wikipedia.org/wiki/Main_Page")

# get all the elements with class vector-body

elements = driver.find_elements(By.CLASS_NAME, "vector-body")

for element in elements:

   print(element.text)

driver.quit()

Comment utiliser XPath avec BeautifulSoup ?

Vous aurez besoin de la bibliothèque Python lxml :

import requests

from bs4 import BeautifulSoup

from lxml import etree

response = requests.get("https://en.wikipedia.org/wiki/Main_Page")

soup = BeautifulSoup(response.content, 'html.parser')

dom = etree.HTML(str(body))

xpath_str = '//h1//text()'

print(dom.xpath(xpath_str))

#Prints ['Main Page', 'Welcome to ', 'Wikipedia']

Comment attendre le chargement de la page dans Selenium ?

Si vous souhaitez simplement attendre un certain temps avant d'expirer lorsque vous essayez de trouver un élément, vous pouvez utiliser la fonction driver.implicitly_wait(time_in_seconds) :

from selenium import webdriver

from selenium.webdriver.common.by import By

DRIVER_PATH = 'C:/Users/Michael/Desktop/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.implicitly_wait(10)

driver.get("https://en.wikipedia.org/wiki/Main_Page")

element = driver.find_element(By.ID, "not_found_id")

# the element does not exist, but it waits 10 seconds for it

text = element.text

print(text)

# Close the browser

driver.quit()

Vous pouvez également choisir d'attendre qu'une certaine condition soit remplie :

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

DRIVER_PATH = 'C:/Users/Michael/Desktop/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.get("https://en.wikipedia.org/wiki/Main_Page")

# Wait for the element with id 'content' to be present on the page

wait = WebDriverWait(driver, 10)

element = wait.until(EC.presence_of_element_located((By.ID, "content")))

element = driver.find_element(By.ID, "content")

text = element.text

print(text)

# Close the browser

driver.quit()

Comment rechercher des éléments HTML à l&#x27;aide de sélecteurs CSS dans Puppeteer ?

Dans Puppeteer, vous pouvez utiliser les fonctions page.$() et page.$$() pour sélectionner des éléments à l'aide de sélecteurs CSS. La fonction page.$() sert à trouver le premier élément correspondant au sélecteur. La fonction page.$$() sert à trouver tous les éléments correspondant au sélecteur.

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch({

    headless: false,

  });

 

  const page = await browser.newPage();

  await page.goto('https://www.scrapethissite.com/pages/simple/');

  // Extract the first odd row element 

  const firstOddRow = await page.$('.container .row');

  console.log(await firstOddRow.evaluate(node => node.textContent));

  // Extract all the odd rows

  const allOddRows = await page.$$('.container .row');

  for (const oddRow of allOddRows) {

    console.log(await oddRow.evaluate(node => node.textContent));

  }

  await browser.close();

})();

Comment trouver des éléments HTML avec des sélecteurs CSS dans Playwright ?

Voici comment procéder avec Playwright. La méthode est très similaire à celle de Puppeteer :

const { chromium } = require('playwright');

(async () => {

  const browser = await chromium.launch({

    headless: false,

  });

  const context = await browser.newContext();

  const page = await context.newPage();

  await page.goto('https://www.scrapethissite.com/pages/simple/');

  // Extract the first odd row element

  const firstOddRow = await page.$('.container .row');

  console.log(await firstOddRow.textContent());

  // Extract all the odd rows

  const allOddRows = await page.$$('.container .row');

  for (const oddRow of allOddRows ) {

    console.log(await oddRow.textContent());

  }

  await browser.close();

})();

Comment trouver des éléments HTML à l&#x27;aide de sélecteurs CSS dans cheerio ?

Avec cheerio, vous devrez récupérer le code HTML (j'ai utilisé la bibliothèque request pour cela), puis le transmettre à la bibliothèque cheerio :

const request = require('request');

const cheerio = require('cheerio');

const url = 'https://www.scrapethissite.com/pages/simple/';

request(url, (error, response, html) => {

  if (!error && response.statusCode === 200) {

    const $ = cheerio.load(html);

    const firstOddRow = $('.container .row').first();

    console.log(firstOddRow.text());

    const allOddRows = $('.container .row');

    allOddRows.each((i, oddRow) => {

      console.log($(oddRow).text());

    });

  }

});

Comment utiliser XPath avec Puppeteer ?

Avec Puppeteer, vous pouvez utiliser la fonction page.$x() pour sélectionner des éléments à l'aide de sélecteurs XPath :

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  await page.goto('https://www.scrapethissite.com/pages/forms/');

  // Extract the table header elements

  const allTableHeaders = await page.$x('//table/tbody/tr[1]//th');

  for(let i = 0; i < allTableHeaders.length; i++) {

    const header = await page.evaluate(el => el.textContent, allTableHeaders[i]);

    console.log(header.trim());

  }

  await browser.close();

})();

// Output:

// Team Name

// Year

// Wins

// Losses

// OT Losses

// Win %

// Goals For (GF)

// Goals Against (GA)

// + / -

Comment utiliser XPath avec Playwright ?

const { chromium } = require('playwright');

(async () => {

  const browser = await chromium.launch({

    headless: false,

  });

  const context = await browser.newContext();

  const page = await context.newPage();

  await page.goto('https://www.scrapethissite.com/pages/forms/');

  // Extract the table header elements

  const allTableHeaders = await page.locator('xpath=//table/tbody/tr[1]//th').all();

 

  for (let i = 0; i < allTableHeaders.length; i++) {

    const headerText = await allTableHeaders[i].innerText();

    console.log(headerText);

  }

  await browser.close();

})();

Toute chaîne de sélection commençant par // ou .. est considérée comme un sélecteur XPath. Par exemple, Playwright convertit « //html/body » en « xpath=//html/body ».

Comment trouver des éléments HTML par texte dans Puppeteer ?

Dans Puppeteer, la manière la plus simple de rechercher des éléments par texte consiste à utiliser la fonction XPath text() :

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch({

    headless: false,

  });

  const page = await browser.newPage();

  await page.goto('https://en.wikipedia.org/wiki/Web_scraping');

   // Select all the p tags texts that contain the word "prevent" 

   const pTags = await page.$x('//p[contains(text(), "prevent")]/text()');

   for(let i = 0; i < pTags.length; i++) {

     const pTag = await page.evaluate(el => el.textContent, pTags[i]);

     console.log(pTag,"\n");

   }

  await browser.close();

})();

//Output:

There are methods that some websites use to prevent web scraping, such as detecting and disallowing bots from crawling (viewing) their pages. In response, there are web scraping systems that rely on using techniques in ...     

Comment rechercher des éléments HTML par texte dans Playwright ?

Si vous souhaitez rechercher des éléments par texte dans Playwright, vous pouvez utiliser la fonction allInnerTexts() en combinaison avec XPath.

const { chromium } = require('playwright');

(async () => {

  const browser = await chromium.launch({

    headless: false,

  });

  const context = await browser.newContext();

  const page = await context.newPage();

  await page.goto('https://en.wikipedia.org/wiki/Web_scraping');

  // Select all the p tags texts that contain the word "prevent" 

  const pTags  = await page.locator('//p[contains(text(), "prevent")]').allInnerTexts();

 

  for (let i = 0; i < pTags.length; i++) {

    console.log(pTags[i], "\n");

  }

  await browser.close();

})();

Comment rechercher des éléments HTML par texte dans cheerio ?

const request = require('request');

const cheerio = require('cheerio');

const url = 'https://en.wikipedia.org/wiki/Web_scraping';

request(url, (error, response, html) => {

  if (!error && response.statusCode === 200) {

    const $ = cheerio.load(html);

  // Select all the p tags texts that contain the word "prevent" 

    const elements = $('p').filter((i, el) => $(el).text().includes('prevent'));

    elements.each((i, el) => {

        console.log($(el).text());

    });

  }

});

Comment attendre l&#x27;apparition de sélecteurs dans Puppeteer ?

Dans Puppeteer, vous pouvez utiliser la fonction page.waitForSelector() pour attendre qu'un élément spécifique apparaisse sur la page avant de poursuivre l'exécution du script. Vous pouvez l'utiliser avec les sélecteurs CSS et XPath :

await page.waitForSelector('.basic-element', { timeout: 10000 });

await page.waitForXPath("//div[@class='basic-element']"), { timeout: 10000 });

Le paramètre timeout spécifie le temps d'attente maximal en millisecondes.

Vous pouvez également attendre qu'un élément atteigne un certain état :

await page.waitForSelector('.basic-element', { visible: true });

// wait until the element becomes visible

Comment attendre l&#x27;apparition de sélecteurs dans Playwright ?

Playwright est similaire à Puppeteer. Vous pouvez utiliser la méthode page.waitForSelector() pour attendre qu'un élément spécifique apparaisse sur la page.

await page.waitForSelector('.element-class', { timeout: 10000 });

Vous pouvez également attendre qu'un élément atteigne un certain état :

 await page.waitForSelector('.basic-element', { state: 'visible' });

 // wait for element to become visible

Conclusion

Le web scraping est un vaste sujet et cet article n'en aborde que les grandes lignes. Il est essentiel de choisir l'outil adapté à votre cas d'utilisation spécifique. Par exemple, si vous souhaitez extraire des données d'un site web à l'aide de JavaScript, la bibliothèque cheerio est une bonne option. Cependant, si le site web nécessite JavaScript pour se charger entièrement, Puppeteer ou Playwright constituent de meilleures options. Le web scraping est un défi, mais la maîtrise des outils peut vous éviter bien des maux de tête. J'espère que cet article vous a ouvert de nouvelles perspectives et je vous souhaite bonne chance dans vos projets de web scraping.

À propos de l'auteur
Mihai Maxim, Développeur Full Stack @ WebScrapingAPI
Mihai MaximDéveloppeur Full Stack

Mihai Maxim est développeur Full Stack chez WebScrapingAPI ; il participe à l'ensemble du produit et contribue à la création d'outils et de fonctionnalités fiables pour la plateforme.

Table of Contents
Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.