Heim >Backend-Entwicklung >Python-Tutorial >Wie man kratzt
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ührenWenn 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:
Danach verwenden wir das Entwicklertool, das fast alle Browser integriert haben:
Wenn Sie mit der rechten Maustaste klicken und dann die Option „Inspizieren“ auswählen, wird das Entwicklertool geöffnet und wir sehen Folgendes:
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:
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!