首页  >  文章  >  后端开发  >  如何刮

如何刮

WBOY
WBOY原创
2024-08-16 18:01:13394浏览

抓取网页抓取是一种用于以自动方式从网站提取数据的技术。它包括使用程序或脚本浏览网页、提取特定信息(例如文本、图像、产品价格等)并保存。

在这篇文章中,我将教授我用来进行抓取的过程以及在执行此操作时要记住的要点。

就我而言,我将在 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