Wie man kratzt

WBOY
WBOYOriginal
2024-08-16 18:01:13486Durchsuche

Scraping oder Web Scraping ist eine Technik, mit der Daten automatisiert von Websites extrahiert werden. Dabei werden Programme oder Skripte verwendet, um auf einer Webseite zu navigieren, bestimmte Informationen (wie Text, Bilder, Produktpreise usw.) zu extrahieren und zu speichern.

In diesem Beitrag erkläre ich Ihnen den Prozess, den ich zum Schaben anwende, und welche wichtigen Punkte Sie dabei beachten sollten.

In meinem Fall werde ich Scraping in PcComponentes durchführen, um Informationen über Laptops zu sammeln. Diese Daten werden verwendet, um einen Datensatz zu erstellen, der als Grundlage für ein Machine Learning-Modell dient, das darauf ausgelegt ist, den Preis eines Laptops basierend auf den angegebenen Komponenten vorherzusagen.

Zunächst muss ermittelt werden, auf welche URL das Skript zugreifen soll, um das Scraping:

durchzuführen

Cómo hacer scrapping

Wenn wir uns in diesem Fall die PcComponentes-URL ansehen, können wir sehen, dass über die URL ein Parameter übergeben wird, mit dem wir angeben können, wonach wir suchen möchten.

Sobald dies erledigt ist, sehen wir das Suchergebnis:

Cómo hacer scrapping

Danach verwenden wir das Entwicklertool, das fast alle Browser integriert haben:

Cómo hacer scrapping

Wenn Sie mit der rechten Maustaste klicken und dann die Option „Inspizieren“ auswählen, wird das Entwicklertool geöffnet und wir sehen Folgendes:

Cómo hacer scrapping

Ein Tag vom Typ Anker (), der viele Informationen zum Produkt enthält, die wir in den Suchergebnissen sehen.

Wenn wir uns den folgenden Bereich ansehen, sehen wir praktisch alle Produktdaten:

Cómo hacer scrapping

Fertig! Wir haben den Bereich, aus dem wir die Daten extrahieren können. Jetzt ist es an der Zeit, das Skript zu erstellen, um sie zu extrahieren.

Aber wir sind auf ein Problem gestoßen: Wenn Sie direkt auf PcComponentes zugreifen, werden wir immer aufgefordert, die Cookie-Richtlinien zu akzeptieren. Wir können also keine GET-Anfrage stellen und das Ergebnis scrapen, da wir sonst nichts bekommen würden.

Daher müssen wir Selenium verwenden, um den Browser zu simulieren und mit ihm interagieren zu können.

Wir beginnen mit den folgenden Schritten:

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

Sobald dies erledigt ist, erhalten wir in der HTML-Variablen den HTML-Code der Seite zum Scraping.

Allerdings stießen wir auf ein anderes Problem. Wenn Sie den Browser mit Selenium öffnen und zwei oder drei Anfragen stellen, begrenzt Cloudflare die Anfragen und erlaubt uns nicht, mehr zu stellen. Daher konnten wir nur etwa 3 Seiten scrapen, was etwa 20 verschiedenen Computern entsprechen würde. Nicht genug, um einen Datensatz zu erstellen.

Eine Lösung, die ich mir ausgedacht habe, bestand darin, die Seite lokal herunterzuladen und lokal mit dem HTML zu arbeiten. Nachdem wir das Scraping durchgeführt haben, können wir einen anderen Browser öffnen (eine angemessene Zeit warten) und den folgenden herunterladen.

Also habe ich den obigen Code zu einer Funktion hinzugefügt und ihn wie folgt in ein for eingeschlossen:

#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)

Jetzt können wir den HTML-Code wiederherstellen und damit arbeiten. Dazu habe ich BeautifulSoup installiert, ein Paket, das sehr oft beim Scraping verwendet wird.

Wir werden die Funktion entwickeln, um die Informationen aus dem HTML zu sammeln, das wir dank der vorherigen Funktion heruntergeladen haben.

Die Funktion sah so aus:

# 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}')

Grundsätzlich öffnen wir die CSV-Datei, in der wir die Informationen speichern, teilen der CSV dann mit, welche Felder sie haben soll, und lesen dann den HTML-Code und arbeiten damit. Wie Sie sehen, musste ich einige zusätzliche Funktionen ausführen, um die erforderlichen Informationen aus jedem Feld extrahieren zu können, das wir in der CSV speichern möchten.

Ich lasse Ihnen hier das vollständige Skript, falls Sie es ausprobieren möchten!

PccomponentsScrapper

Das obige ist der detaillierte Inhalt vonWie man kratzt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn