首頁  >  文章  >  後端開發  >  如何刮

如何刮

WBOY
WBOY原創
2024-08-16 18:01:13466瀏覽

抓取網頁抓取是一種用於以自動方式從網站提取資料的技術。它包括使用程式或腳本瀏覽網頁、提取特定資訊(例如文字、圖像、產品價格等)並保存。

在這篇文章中,我將教授我用來進行抓取的過程以及在執行此操作時要記住的要點。

就我而言,我將在 PcComponentes 中執行抓取來收集有關筆記型電腦的資訊。這些數據將用於創建一個數據集,作為機器學習模型的基礎,該模型旨在根據指定的組件預測筆記型電腦的價格。

首先,需要確定腳本應存取哪個 URL 來執行抓取:

Cómo hacer scrapping

在這種情況下,如果我們查看 PcComponentes URL,我們可以看到它透過 URL 傳遞了一個參數,我們可以使用該參數來指定我們要搜尋的內容。

完成後,我們將看到搜尋結果:

Cómo hacer scrapping

之後,我們將使用幾乎所有瀏覽器都整合的開發者工具:

Cómo hacer scrapping

右鍵單擊然後選擇“檢查”選項,開發者工具將打開,我們將看到以下內容:

Cómo hacer scrapping

anchor () 類型的標籤,其中包含有關我們在搜尋結果中看到的產品的大量資訊。

如果我們查看以下區域,我們將看到幾乎所有的產品資料:

Cómo hacer scrapping

完成!我們有從中提取資料的區域。現在是時候創建腳本來提取它們了。

但是我們遇到了一個問題:如果你直接訪問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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn