Maison  >  Article  >  développement back-end  >  Comment gratter

Comment gratter

WBOY
WBOYoriginal
2024-08-16 18:01:13468parcourir

Le

scraping ou web scraping est une technique utilisée pour extraire des données de sites Web de manière automatisée. Elle consiste à utiliser des programmes ou des scripts pour naviguer sur une page Web, en extraire des informations spécifiques (telles que du texte, des images, les prix des produits, etc.) et les enregistrer.

Dans cet article, j'enseignerai le processus que j'utilise pour faire du grattage et les points importants à garder à l'esprit lorsque je le fais.

Dans mon cas, j'effectuerai un scraping dans PcComponentes pour collecter des informations sur les ordinateurs portables. Ces données seront utilisées pour créer un ensemble de données qui servira de base à un modèle de Machine Learning, conçu pour prédire le prix d'un ordinateur portable en fonction des composants spécifiés.

Tout d'abord, il est nécessaire d'identifier à quelle URL le script doit accéder pour effectuer le scraping :

Cómo hacer scrapping

Dans ce cas, si nous regardons l'URL de PcComponentes, nous pouvons voir qu'elle transmet un paramètre via l'URL, que nous pouvons utiliser pour spécifier ce que nous voulons rechercher.

Une fois cela fait, nous verrons le résultat de la recherche :

Cómo hacer scrapping

Après cela, nous utiliserons l'outil de développement que presque tous les navigateurs ont intégré :

Cómo hacer scrapping

En cliquant avec le bouton droit puis en sélectionnant l'option "Inspecter", l'outil de développement s'ouvrira et nous verrons ce qui suit :

Cómo hacer scrapping

Une balise de type ancre () qui contient de nombreuses informations concernant le produit que nous voyons dans les résultats de recherche.

Si nous regardons la zone suivante, nous verrons pratiquement toutes les données du produit :

Cómo hacer scrapping

Fait ! Nous disposons de la zone à partir de laquelle extraire les données. Il est maintenant temps de créer le script pour les extraire.

Mais nous avons rencontré un problème : si vous accédez directement à PcComponentes, il nous demande toujours d'accepter les politiques en matière de cookies. Nous ne pouvons donc pas faire de requête GET et gratter le résultat, car nous n'obtiendrons rien.

Nous devrons donc utiliser Selenium pour simuler le navigateur et pouvoir interagir avec lui.

Nous commençons par faire ce qui suit :

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

options = Options()
options.headless = True
#Abrimos el navegador
driver = webdriver.Firefox(options=options)
time.sleep(5)
#Vamos a la página indicada pccomponentes.com/laptops
driver.get(url+str(i))
#Esperamos 30 segundos hasta que aparezca el botón de cookies y al aparecer hace clic
accept_cookies = WebDriverWait(driver, 30).until(
    EC.presence_of_element_located((By.ID, 'cookiesAcceptAll'))
)     
accept_cookies.click()
#Descargamos el HTML
html = driver.page_source

Une fois cela fait, dans la variable html nous obtiendrons le code HTML de la page à scrape.

Cependant, nous avons rencontré un autre problème. Lors de l'ouverture du navigateur avec Selenium et de la réalisation de 2 ou 3 requêtes, Cloudflare limite les requêtes et ne nous permet pas d'en faire plus. Par conséquent, nous ne pourrions gratter environ 3 pages, ce qui représenterait environ 20 ordinateurs différents. Pas suffisant pour créer un ensemble de données.

Une solution que j'ai proposée était de télécharger la page localement et de travailler avec le HTML localement. Après avoir fait le scraping, nous pourrions ouvrir un autre navigateur (en attendant un temps raisonnable) et télécharger le suivant.

J'ai donc ajouté le code ci-dessus à une fonction et l'ai enveloppé dans un for comme suit :

#Función que se conecta a pccomponentes y guarda el html en local 
def guarda_datos_html(i=0):
    try:
        options = Options()
        options.headless = True
        #Abrimos el navegador
        driver = webdriver.Firefox(options=options)

        time.sleep(5)
        #Vamos a la página indicada pccomponentes.com/laptops
        driver.get(url+str(i))
        #Esperamos 30 segundos hasta que aparezca el botón de cookies y al aparecer hace clic
        accept_cookies = WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.ID, 'cookiesAcceptAll'))
        )

        accept_cookies.click()
        #Descargamos el HTML
        html = driver.page_source
        #Lo guardamos en local
        with open(f'html/laptops_{i}.html','w',encoding="utf-8") as document:
            document.write(html)

        driver.close()
    except:
        print(f'Error en página: {i}')

for i in range(0,58):
    guarda_datos_html(i)
    time.sleep(30)

Maintenant, nous pouvons récupérer le HTML et travailler avec eux. Pour ce faire, j'ai installé BeautifulSoup, un package très souvent utilisé en scraping.

Nous allons développer la fonction pour collecter les informations du HTML que nous avons téléchargé grâce à la fonction précédente.

La fonction ressemblait à ceci :

# Función que abre el HTML guardado con anterioridad y filtra los datos
# para guardarlos en un CSV ordenados
def get_datos_html(i=0):
    try:
        with open(f'laptop_data_actual.csv','a') as ldata:

            field = ['Company','Inches','Cpu','Ram','Gpu','OpSys','SSD','Price']
            writer = csv.DictWriter(ldata, fieldnames=field)


            with open(f'html/laptops_{i}.html','r',encoding="utf-8") as document:

                html = BeautifulSoup(document.read(), 'html.parser')
                products = html.find_all('a')

                for element in products:
                    pc = element.get('data-product-name')
                    if pc:
                        pc = pc.lower()
                        marca = element.get('data-product-brand')
                        price = element.get('data-product-price')
                        pc_data = pc.split('/')
                        cpu = pc_data[0].split(' ')

                        cpu = buscar_cpu(cpu)
                        gpu = buscar_gpu(pc_data)
                        inches = '.'.join([s for s in re.findall(r'\b\d+\b', pc_data[-1])])
                        OpSys = bucar_opsys(pc_data, marca)

                        row = {
                            'Company': marca,
                            'Inches': inches,
                            'Cpu': cpu,
                            'Ram': pc_data[1],
                            'Gpu': gpu,
                            'OpSys': OpSys,
                            'SSD': pc_data[2],
                            'Price': price
                        }

                        writer.writerow(row)
    except:
        print(f'Error en página: {i}')

En gros, nous ouvrons le fichier CSV dans lequel nous enregistrerons les informations, puis nous indiquons au CSV quels champs nous voulons qu'il ait, puis nous lisons et travaillons avec le HTML. Comme vous pouvez le voir, j'ai dû faire quelques fonctions supplémentaires pour pouvoir extraire les informations nécessaires de chaque champ que nous souhaitons enregistrer dans le CSV.

Je vous laisse le script complet ici au cas où vous voudriez l'essayer !

PccomposantsScrapper

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn