Cara mengikis

WBOY
WBOYasal
2024-08-16 18:01:13486semak imbas

mengikis atau mengikis web ialah teknik yang digunakan untuk mengekstrak data daripada tapak web secara automatik. Ia terdiri daripada menggunakan program atau skrip untuk menavigasi halaman web, mengekstrak maklumat tertentu (seperti teks, imej, harga produk, dll.), dan menyimpannya.

Dalam siaran ini, saya akan mengajar proses yang saya gunakan untuk melakukan mengikis dan perkara penting yang perlu diingat semasa melakukannya.

Dalam kes saya, saya akan melakukan mengikis dalam PcComponentes untuk mengumpul maklumat tentang komputer riba. Data ini akan digunakan untuk mencipta set data yang akan menjadi asas untuk model Pembelajaran Mesin, yang direka untuk meramalkan harga komputer riba berdasarkan komponen yang dinyatakan.

Pertama, adalah perlu untuk mengenal pasti URL mana yang harus diakses oleh skrip untuk melakukan mengikis:

Cómo hacer scrapping

Dalam kes ini, jika kita melihat pada URL PcComponentes, kita dapat melihat bahawa ia menghantar parameter melalui URL, yang boleh kita gunakan untuk menentukan perkara yang ingin kita cari.

Setelah ini selesai, kita akan melihat hasil carian:

Cómo hacer scrapping

Selepas ini, kami akan menggunakan alat pembangun yang telah disepadukan oleh hampir semua penyemak imbas:

Cómo hacer scrapping

Dengan mengklik kanan dan kemudian memilih pilihan "Periksa", alat pembangun akan dibuka dan kita akan melihat perkara berikut:

Cómo hacer scrapping

Teg jenis sauh () yang mengandungi banyak maklumat berkenaan produk yang kita lihat dalam hasil carian.

Jika kita melihat kawasan berikut, kita akan melihat hampir semua data produk:

Cómo hacer scrapping

Selesai! Kami mempunyai kawasan untuk mengekstrak data. Kini tiba masanya untuk mencipta skrip untuk mengekstraknya.

Tetapi kami menghadapi masalah: jika anda mengakses PcComponentes secara langsung, ia sentiasa meminta kami menerima dasar kuki. Jadi, kami tidak boleh membuat permintaan GET dan mengikis hasilnya, kerana kami tidak akan mendapat apa-apa.

Oleh itu, kita perlu menggunakan Selenium untuk mensimulasikan penyemak imbas dan boleh berinteraksi dengannya.

Kami mulakan dengan melakukan perkara berikut:

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

Setelah ini dilakukan, dalam pembolehubah html kita akan memperoleh kod HTML halaman untuk mengikis.

Namun, kami menghadapi masalah lain. Apabila membuka penyemak imbas dengan Selenium dan membuat 2 atau 3 permintaan, Cloudflare mengehadkan permintaan dan tidak membenarkan kami membuat lebih banyak. Oleh itu, kami hanya boleh mengikis kira-kira 3 halaman, iaitu kira-kira 20 komputer yang berbeza. Tidak cukup untuk membuat set data.

Satu penyelesaian yang saya buat ialah memuat turun halaman secara tempatan dan berfungsi dengan HTML secara tempatan. Selepas melakukan mengikis, kami boleh membuka penyemak imbas lain (menunggu tempoh masa yang munasabah) dan memuat turun yang berikut.

Jadi saya menambah kod di atas pada fungsi dan membungkusnya dalam untuk seperti berikut:

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

Kini kami boleh memulihkan HTML dan bekerjasama dengan mereka. Untuk melakukan ini, saya memasang BeautifulSoup, pakej yang sangat kerap digunakan dalam mengikis.

Kami akan membangunkan fungsi untuk mengumpul maklumat daripada HTML yang telah kami muat turun terima kasih kepada fungsi sebelumnya.

Fungsinya kelihatan seperti ini:

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

Pada asasnya, kami membuka fail CSV di mana kami akan menyimpan maklumat itu, kemudian kami memberitahu CSV medan yang kami mahu ia ada, dan kemudian kami membaca dan bekerja dengan HTML. Seperti yang anda lihat, saya terpaksa melakukan beberapa fungsi tambahan untuk dapat mengekstrak maklumat yang diperlukan daripada setiap medan yang ingin kami simpan dalam CSV.

Saya tinggalkan anda skrip lengkap di sini sekiranya anda ingin mencubanya!

PccomponentsScrapper

Atas ialah kandungan terperinci Cara mengikis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn