CoderCastrov logo
CoderCastrov
Парсер

Автоматизация и парсинг процесса получения информации о продукте с веб-страницы (Python, Selenium, Chrome)

Автоматизация и парсинг процесса получения информации о продукте с веб-страницы (Python, Selenium, Chrome)
просмотров
4 мин чтение
#Парсер
Table Of Content

Исходный код: https://github.com/nassrkhan/Bema_Site

Для загрузки chromedriver: https://sites.google.com/chromium.org/driver/

Этот код - это скрипт на языке Python, который автоматизирует процесс получения информации о продукте с веб-страницы с использованием библиотеки Selenium и сохраняет информацию в CSV-файле. Давайте рассмотрим код пошагово:

# Импорт необходимых модулей и пакетов
import csv  # Модуль для работы с CSV-файлами
from selenium import webdriver  # Пакет для автоматизации веб-браузера
import undetected_chromedriver as uc  # Пакет для использования браузера Chrome с Selenium
from selenium.webdriver.common.by import By  # Модуль для поиска элементов на веб-странице
from selenium.webdriver.chrome.options import Options  # Модуль для настройки параметров Chrome
from selenium.webdriver.chrome.service import Service  # Модуль для управления службой ChromeDriver
from selenium.webdriver.support.ui import WebDriverWait  # Модуль для реализации функций ожидания
from selenium.webdriver.support import expected_conditions as EC  # Модуль для определения ожидаемых условий
# Путь к исполняемому файлу ChromeDriver
driver_path = "./chromedriver.exe"

# Создание экземпляра ChromeOptions для настройки браузера Chrome
chrome_options = Options()

# Создание объекта Service с указанным путем к драйверу
service = Service(driver_path)

# Создание объекта WebDriver с настроенным сервисом и параметрами
driver = webdriver.Chrome(service=service, options=chrome_options)

Разберем каждую строку кода:

После выполнения этого кода у вас будет полностью настроенный объект driver, который можно использовать для автоматизации действий в браузере Chrome, таких как переход на веб-страницы, взаимодействие с элементами или извлечение данных.

Ссылки на продукты

Функция с названием Products_links, которая извлекает ссылки на продукты из заданного URL. Ссылки хранятся в списке All_Product.

# Пустой список для хранения ссылок на продукты
All_Product = []

# Определение функции для извлечения ссылок на продукты из заданного URL
def Products_links(url):
    # Открытие URL в браузере
    driver.get(url)
    
    # Ожидание появления элемента обертки списка
    list_wrapper = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "list-wrapper")))
    
    # Поиск всех элементов <a> внутри обертки списка
    a_elements = list_wrapper.find_elements(By.TAG_NAME, "a")
    
    # Перебор каждого элемента <a> и извлечение атрибута href (ссылки)
    for a in a_elements:
        All_Product.append(a.get_attribute('href'))
        
    # Сохранение ссылок на продукты в переменной 'pro' и очистка списка 'All_Product'
    pro = All_Product
    All_Product.clear()
    
    # Возврат ссылок на продукты
    return pro

Функцию Products_links можно вызвать с URL в качестве аргумента, чтобы извлечь ссылки на продукты. Ссылки будут сохранены в списке All_Product и возвращены функцией.

Функция с названием Product_details, которая извлекает различные детали продуктов из списка ссылок и сохраняет информацию в отдельных списках. Она также записывает собранные данные в CSV-файл.

Детали продуктов

Функция с названием Product_details, которая извлекает различные детали продуктов из списка ссылок и сохраняет информацию в отдельных списках. Она также записывает собранные данные в CSV-файл.

# Списки для хранения деталей продуктов
Title = []
Title_url = []
Product_number = []
Short_des = []
Price = []
Image_url = []
Description = []

# Определение функции для извлечения деталей продуктов из списка ссылок
def Product_details(file_name, links):
    c = 0
    for i in links:
        # Открываем ссылку в браузере
        driver.get(i)
        driver.implicitly_wait(15)
        
        try:
            h1 = driver.find_element(By.TAG_NAME, "h1").text
            Title.append(h1)
        except:
            Title.append('')
        
        # Добавляем ссылку в список Title_url
        Title_url.append(i)
        
        try:
            Pro_num = driver.find_element(By.CLASS_NAME, "product-info-sku").text
            Product_number.append(Pro_num)
        except:
            Product_number.append('')
            
        try:
            shor_des = driver.find_element(By.CLASS_NAME, "digest").text
            Short_des.append(shor_des)
        except:
            Short_des.append('')
        
        try:
            prc = driver.find_element(By.CLASS_NAME, "price").text
            Price.append(prc)
        except:
            Price.append('')
    
        try:
            img_element = driver.find_element(By.TAG_NAME, "img")
            img_link = img_element.get_attribute("src")
            Image_url.append(img_link)
        except:
            Image_url.append('')
    
        try:
            des = driver.find_element(By.CLASS_NAME, "main-content").text
            Description.append(des)
        except:
            Description.append('')
        
        c = c + 1
        print(f"{c} завершено.")
    
    # Записываем собранные данные в CSV-файл
    with open(file_name + '.csv', 'w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['Название', 'Ссылка на название', 'Артикул', 'Краткое описание', 'Цена', 'Ссылка на изображение', 'Описание'])
        
        for i in range(len(Title)):
            writer.writerow([Title[i], Title_url[i], Product_number[i], Short_des[i], Price[i], Image_url[i], Description[i]])
    
    return file_name
# Введите эту ссылку
#https://www.bema.no/bensinslanger/category1164.html#/
url = input("Введите URL: ")
links = Products_links(url)

После выполнения этого кода переменная links будет содержать ссылки на продукты, полученные из введенного URL с помощью функции Products_links.

from collections import OrderedDict

# Удаление повторяющихся ссылок из списка
links = list(OrderedDict.fromkeys(links))

После выполнения этого кода список links будет содержать уникальные ссылки на продукты, с удалением любых дубликатов, сохраняя при этом исходный порядок.

# Введите имя файла, которое вы хотите задать
file_name = input("Введите имя файла: ")
Product_details(file_name, links)
driver.quit()

Очистка данных

import base64
import requests
import pandas as pd

Преобразование URL-адресов изображений из формата base64 в обычные URL-адреса

base = []

# Перебираем каждый URL-адрес в столбце 'Image Url' DataFrame
for url in df1['Image Url']:
    if url.startswith('data:image'):
        base64_link = url
        binary_data = base64.b64decode(base64_link.split(",")[1])

        response = requests.post("https://api.imgbb.com/1/upload", 
                                files={"image": binary_data},
                                data={"key": "878da7435f172283e4ada776b37ed00a"})
        regular_link = response.json()["data"]["url"]
        base.append(regular_link)
    else:
        base.append(url)

# Обновляем столбец 'Image Url' в DataFrame с преобразованными URL-адресами
df1['Image Url'] = base

# Сохраняем измененный DataFrame в CSV-файл
df1.to_csv("original.csv", index=False)

Заключительные заметки

Спасибо, что уделили время чтению этого объяснения! Если вам нужен опытный фрилансер по Python для ваших проектов, я готов к сотрудничеству. Как опытный разработчик Python, я могу помочь вам с различными задачами, включая парсинг веб-сайтов, автоматизацию, анализ данных и многое другое. Не стесняйтесь связаться со мной по адресу https://www.freelancer.com/u/NassrKhan, чтобы обсудить подробности вашего проекта.

Если вам понравилась эта информация, я был бы признателен, если бы вы поддержали этот ответ аплодисментами 👏. Ваш отзыв важен и побуждает меня предоставлять более полезный контент.

Не стесняйтесь обращаться, если у вас возникнут дополнительные вопросы или если вам нужна помощь с Python или любыми другими темами, связанными с программированием. Счастливого кодирования!