Web - парсинг — это метод извлечения данных, используемый исключительно для сбора данных с веб-сайтов. Он широко применяется для интеллектуального анализа данных или сбора ценной информации с крупных веб-сайтов. Веб-парсинг также полезен для личного использования. В Python есть замечательная библиотека под названием BeautifulSoup , которая позволяет выполнять веб-парсинг. Мы будем использовать её для сбора информации о товарах и сохранения данных в файл CSV.

В этой статье необходимы следующие предварительные условия.

url.txt: текстовый файл с несколькими URL-адресами страниц товаров Amazon для парсинга

Идентификатор элемента: нам нужны идентификаторы объектов, которые мы хотим извлечь из Интернета. Скоро мы это обсудим…

Вот как выглядит наш текстовый файл.

Необходимый модуль и установка:

BeautifulSoup: наш основной модуль содержит метод для доступа к веб-странице по протоколу HTTP.

pip install bs4

lxml: вспомогательная библиотека для обработки веб-страниц на языке Python.

pip install lxml

requests:  делают процесс отправки HTTP-запросов безупречным. вывод функции

pip install requests

Подход:

  • Сначала мы собираемся импортировать необходимые нам библиотеки.
  • Затем мы возьмем URL, хранящийся в нашем текстовом файле.
  • Мы передадим URL-адрес нашему объекту-супу, который затем извлечёт нужную информацию из указанного URL-адреса
    на основе предоставленного нами идентификатора элемента и сохранит её в нашем CSV-файле.

Давайте посмотрим на код и увидим, что происходит на каждом важном этапе.

Шаг 1: Инициализация нашей программы.

Мы импортируем beautifulsoup и запросы, создаем/открываем CSV-файл для сохранения собранных данных. Мы объявили заголовок и добавили пользовательский агент. Это гарантирует, что целевой сайт, с которого мы будем собирать данные, не будет считать трафик нашей программы спамом и не заблокирует его. 

from bs4 import BeautifulSoup
import requests

File = open("out.csv", "a")

HEADERS = ({'User-Agent':
           'Mozilla/5.0 (X11; Linux x86_64) 
                AppleWebKit/537.36 (KHTML, like Gecko) 
                    Chrome/44.0.2403.157 Safari/537.36',
                           'Accept-Language': 'en-US, en;q=0.5'})

webpage = requests.get(URL, headers=HEADERS)
soup = BeautifulSoup(webpage.content, "lxml")

Шаг 2: Получение идентификаторов элементов.

Мы определяем элементы, просматривая отображаемые веб-страницы, чего нельзя сказать о нашем скрипте. Чтобы определить целевой элемент, мы получим его идентификатор и передадим его скрипту.

Получить идентификатор элемента довольно просто. Предположим, мне нужен идентификатор элемента с названием продукта. Всё, что мне нужно сделать, — это

  1. Перейдите по URL-адресу и просмотрите текст
  2. В консоли мы берем текст рядом с id =

getelementbyid-копия-2

 

Мы передаём его в функцию soup.find и преобразуем вывод функции в строку. Мы удаляем запятые из строки, чтобы они не мешали формату записи CSV.

try:
        title = soup.find("span", 
                          attrs={"id": 'productTitle'})
       title_value = title.string

        title_string = title_value
                    .strip().replace(',', '')
          
except AttributeError:

        title_string = "NA"

        print("product Title = ", title_string)

Шаг 3: Сохранение текущей информации в текстовый файл

Мы используем наш объект файла и записываем только что полученную строку, завершая её запятой «,», чтобы разделить столбцы при интерпретации в формате CSV.

File.write(f"{title_string},")

Выполните описанные выше 2 шага для всех атрибутов, которые вы хотите получить из Интернета,
например, цена товара, наличие и т. д.

Шаг 4: Закрытие файла.

File.write(f"{available},\n")

# closing the file
File.close()

При вводе последней части информации обратите внимание, что мы добавляем «\n» для перехода на новую строку. Если этого не сделать, вся необходимая информация будет записана в одну очень длинную строку. Мы закрываем файл с помощью File.close(). Это необходимо, иначе при следующем открытии файла может возникнуть ошибка.

Шаг 5: Вызов функции, которую мы только что создали.

if __name__ == '__main__':
  # opening our url file to access URLs
    file = open("url.txt", "r")

    # iterating over the urls
    for links in file.readlines():
        main(links)

Мы открываем файл url.txt в режиме чтения и перебираем каждую его строку, пока не дойдём до последней. Вызываем основную функцию для каждой строки.

Вот как выглядит весь наш код:

# importing libraries
from bs4 import BeautifulSoup
import requests

def main(URL):
    # opening our output file in append mode
    File = open("out.csv", "a")

    # specifying user agent, You can use other user agents
    # available on the internet
    HEADERS = ({'User-Agent':
                'Mozilla/5.0 (X11; Linux x86_64) 
                    AppleWebKit/537.36 (KHTML, like Gecko) 
                            Chrome/44.0.2403.157 Safari/537.36',
                                'Accept-Language': 'en-US, en;q=0.5'})

    # Making the HTTP Request
    webpage = requests.get(URL, headers=HEADERS)

    # Creating the Soup Object containing all data
    soup = BeautifulSoup(webpage.content, "lxml")

    # retrieving product title
    try:
        # Outer Tag Object
        title = soup.find("span", 
                          attrs={"id": 'productTitle'})

        # Inner NavigableString Object
        title_value = title.string

        # Title as a string value
        title_string = title_value.strip().replace(',', '')

    except AttributeError:
        title_string = "NA"
    print("product Title = ", title_string)

    # saving the title in the file
    File.write(f"{title_string},")

    # retrieving price
    try:
        price = soup.find(
            "span", attrs={'id': 'priceblock_ourprice'})
                                .string.strip().replace(',', '')
        # we are omitting unnecessary spaces
        # and commas form our string
    except AttributeError:
        price = "NA"
    print("Products price = ", price)

    # saving
    File.write(f"{price},")

    # retrieving product rating
    try:
        rating = soup.find("i", attrs={
                           'class': 'a-icon a-icon-star a-star-4-5'})
                                    .string.strip().replace(',', '')

    except AttributeError:

        try:
            rating = soup.find(
                "span", attrs={'class': 'a-icon-alt'})
                                .string.strip().replace(',', '')
        except:
            rating = "NA"
    print("Overall rating = ", rating)

    File.write(f"{rating},")

    try:
        review_count = soup.find(
            "span", attrs={'id': 'acrCustomerReviewText'})
                                .string.strip().replace(',', '')

    except AttributeError:
        review_count = "NA"
    print("Total reviews = ", review_count)
    File.write(f"{review_count},")

    # print availablility status
    try:
        available = soup.find("div", attrs={'id': 'availability'})
        available = available.find("span")
                    .string.strip().replace(',', '')

    except AttributeError:
        available = "NA"
    print("Availability = ", available)

    # saving the availability and closing the line
    File.write(f"{available},\n")

    # closing the file
    File.close()


if __name__ == '__main__':
  # opening our url file to access URLs
    file = open("url.txt", "r")

    # iterating over the urls
    for links in file.readlines():
        main(links)

Вывод:

Название продукта = 3D-принтер Dremel DigiLab 3D40 Flex с дополнительными принадлежностями, 30 планами уроков, курс профессионального развития, гибкая монтажная пластина, автоматическое 9-точечное выравнивание, совместимость с ПК и MAC OS, Chromebook, iPad
Цена продукта = 1699,00 долларов США
Общая оценка = 4,1 из 5 звезд
Общее количество отзывов = 40 оценок
Наличие = В наличии.
Название продукта = 3D-принтер Comgrow Creality Ender 3 Pro со съемной пластиной для сборки и сертифицированным UL блоком питания 220x220x250 мм
Цена продукта = NA
Общая оценка = 4,6 из 5 звезд
Всего отзывов = 2509 оценок
Наличие = NA
Название продукта = Конструктор идей для 3D-принтера Dremel Digilab 3D20 для начинающих любителей и мастериц
Цена продукта = $ 679,00
Общая оценка = 4,5 из 5 звезд
Всего отзывов = 584 оценки
Наличие = В наличии .
Название продукта = 3D-принтер Dremel DigiLab 3D45, отмеченный наградами, с нитью накаливания, совместимый с ПК и MAC OS, Chromebook, iPad, сетевой, со встроенной HD-камерой, нагревательной платформой, нейлоновой, ECO, ABS, PETG, PLA, возможностью печати
Цена продукта = 1710,81 $
Общая оценка = 4,5 из 5 звезд
Общее количество отзывов = 351 оценка
Наличие = В наличии.

Вот как выглядит наш файл out.csv.