抓取或網頁抓取是一種用於以自動方式從網站提取資料的技術。它包括使用程式或腳本瀏覽網頁、提取特定資訊(例如文字、圖像、產品價格等)並保存。
在這篇文章中,我將教授我用來進行抓取的過程以及在執行此操作時要記住的要點。
就我而言,我將在 PcComponentes 中執行抓取來收集有關筆記型電腦的資訊。這些數據將用於創建一個數據集,作為機器學習模型的基礎,該模型旨在根據指定的組件預測筆記型電腦的價格。
首先,需要確定腳本應存取哪個 URL 來執行抓取:
在這種情況下,如果我們查看 PcComponentes URL,我們可以看到它透過 URL 傳遞了一個參數,我們可以使用該參數來指定我們要搜尋的內容。
完成後,我們將看到搜尋結果:
之後,我們將使用幾乎所有瀏覽器都整合的開發者工具:
右鍵單擊然後選擇“檢查”選項,開發者工具將打開,我們將看到以下內容:
anchor () 類型的標籤,其中包含有關我們在搜尋結果中看到的產品的大量資訊。
如果我們查看以下區域,我們將看到幾乎所有的產品資料:
完成!我們有從中提取資料的區域。現在是時候創建腳本來提取它們了。
但是我們遇到了一個問題:如果你直接訪問PcComponentes,它總是要求我們接受cookie策略。因此,我們無法發出 GET 請求並抓取結果,因為我們不會得到任何東西。
因此,我們必須使用Selenium來模擬瀏覽器並能夠與其互動。
我們先執行以下操作:
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
完成後,在 html 變數中我們將取得頁面的 HTML 程式碼抓取。
但是,我們遇到了另一個問題。當使用 Selenium 開啟瀏覽器並發出 2 或 3 個請求時,Cloudflare 會限制請求並且不允許我們發出更多請求。因此,我們只能抓取大約 3 個頁面,這將是大約 20 台不同的電腦。不足以製作數據集。
我提出的一個解決方案是在本地下載頁面並在本地使用 HTML。完成抓取後,我們可以開啟另一個瀏覽器(等待一段合理的時間)並下載以下瀏覽器。
所以我將上面的程式碼加入一個函數中,並將其包裝在 for 中,如下所示:
#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)
現在我們可以恢復 HTML 並使用它們。為此,我安裝了BeautifulSoup,這是一個在抓取中經常使用的軟體包。
我們將開發一個功能,從我們下載的 HTML 中收集信息,這要歸功於先前的功能。
函數如下圖所示:
# 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}')
基本上,我們打開 CSV 文件,在其中保存信息,然後告訴 CSV 我們希望它具有哪些字段,然後讀取並使用 HTML。正如您所看到的,我必須執行一些額外的函數才能從我們想要保存在 CSV 中的每個欄位中提取必要的資訊。
我在這裡留下了完整的腳本,以防你想嘗試!
PCComponentsScrapper
以上是如何刮的詳細內容。更多資訊請關注PHP中文網其他相關文章!