В данном примере разберём, как собрать информацию с Wildberries, не привлекая API, и сэкономить своё время при решении рутинных задач.
Отличие от API
Более известный альтернативный метод получения данных сайта - вызовы API. Это официально предоставляемый владельцем сайта способ получения сведений из баз данных или других источников. Обычно для этого требуется разрешение доступа, специальный токен (а иногда и не один). Однако такие методы доступны не всегда. И в этой ситуации встаёт вопрос: потратить кучу времени и собрать данные вручную или использовать скрапинг? Если вам нужно всего несколько записей, то ручная сборка не самый плохой вариант, но следует помнить, что чем больше датасет, тем больше выводов можно сделать о содержащихся в нём данных, тем более репрезентативные выборки можно получить и больше спектр возможных методов обработки данных.
Насколько это законно?
Скрапинг может нарушать копирайт или правила использования сайта, особенно когда он используется для получения прибыли, конкурентного преимущества или причинения ущерба (например из-за слишком частых запросов). Однако скрапинг публично доступен и используется для личных целей, академических целей или безвредного некоммерческого использования. Если данные являются платными, требуют регистрации, имеют явную защиту от скрапинга, содержат конфиденциальные данные или личные данные пользователей, то нужно избегать любого из видов скрапинга.
Преимущества
Представим, что вам нужно собрать некоторую информацию с маркетплейса: вы не являетесь продавцом, вам нужна информация по другим пользователям, а не лично о вашей компании, методов, способных предоставить такую информацию по API, на данный момент нет.
Что мне понадобится?
Для осуществления метода нам понадобится установленный Python, среда разработки и… всё. Установку Python лучше осуществлять с официального сайта , мы рекомендуем использовать не самую последнюю версию, а более стабильную. Например, проверенный временем Python 3.7.x вам идеально подойдёт. В качестве среды вы можете выбрать, что вашей душе угодно. В данном примере объяснения будут приводиться с помощью PyСharm.
Инструкция по установке Python
1. Запускаем скачанный интерпретатор Python со стандартным набором библиотек (.exe файл). 2. В первом открывшемся окне будет выбор установки: простой (верхний) и сложный (нижний). Сначала включите нижний флажок «Add Python 3.x (в нашем случае 3.7) to PATH». Эта опция позволит использовать Python в любом месте через консоль. И далее запустите простую установку.
После этого можно открывать PyCharm, создавать новый проект, а в нём скрипт Python.
Как это реализовать?
Для веб-скрапинга нет универсального решения, поскольку способ, с помощью которого данные содержатся на сайте, обычно специфичен. На самом деле, если вы хотите собрать данные с сайта, вам необходимо понять структуру сайта и, либо создать собственное решение, либо воспользоваться гибким и перенастраиваемым вариантом уже готового решения. Изобретать велосипед здесь не нужно: существует множество пакетов, которые, скорее всего, вам вполне подойдут. В зависимости от ваших навыков программирования и предполагаемого варианта использования вы можете найти разные более или менее полезные для себя пакеты.
Итак, задача: собрать сведения, содержащие название компании (продавца) и количество товаров в продаже.
Для начала нужно понять, как вообще данная информация представлена на сайте и с каких страниц нам нужно будет её забирать. Как можно заметить, в шапке страницы присутствует вся необходимая нам информация. Для того чтобы её извлечь, изучим разметку страницы “изнутри”. Для этого воспользуемся встроенными в браузер инструментами, например, в Chrome при нажатии сочетания клавиш Ctrl+Shift+I мы можем получить код страницы :
Слева появилась HTML-разметка, в которой прописаны все элементы веб-страницы и содержащийся в них текст. Например, если на странице выделить название компании, нажать правой кнопкой мыши и выбрать опцию “просмотреть код”
Мы сможем увидеть как размечена данная область (то есть класс и теги объекта):
Так, изучая разметку, можно определить расположение каждой сущности страницы (название компании, рейтинг, проданные товары и т.д) в HTML.
Как же представить это в коде?
Для этого пригодятся несколько библиотек :
BeautifulSoup — это библиотека, позволяющая сделать синтаксический разбор (парсинг) HTML-кода.
Кроме того, вам также потребуется библиотека Request, которая будет отображать содержимое URL-адреса.
csv - для конечного представления данных.
re - для извлечения сущностей по заданному шаблону (регулярные выражения).
Так мы можем написать свои первые строки кода:
Самое главное, что нужно для скрапинга - адрес страницы, с которой будем брать информацию. Мы рассматривали HTML на примере страницы. Посмотрев внимательно, можно догадаться, что 1 в конце выполняет функцию своеобразного id-шника. То есть, заменив 1 на 2, мы получим уже нового продавца. Если нам нужно “проскрапить” множество страниц, то достаточно взять за основу “тело” ссылки, а айдишники прибавлять, например, в цикле. Также сразу откроем для записи csv-файл, в который будем загружать полученную информацию. Важно отметить, что самого файла может не существовать, при запуске кода он создастся автоматически. Если вы не укажете явно путь, то файл будет находить в папке проекта рядом со скриптом. В данном примере разберем скрапинг первых 100 страниц продавцов:
Здесь wb100.csv - имя файла. Если бы нам нужно было поместить файл в конкретное место, например, на диск D, то стоило явно прописать:
В строке
мы определяем метод writer для csv-файла, указанного выше.
Далее можем приступать к сбору нужной информации :) Для записи в csv будем использовать результирующий список для каждого продавца, назовем его seller_row. В seller_row будем записывать поэлементно информацию с помощью встроенного в Python метода append:
Зная базовую ссылку и id, можно получить новую, уже относящуюся к конкретному продавцу, ссылку:
В выводе мы получим 100 строк следующего вида:
Теперь, имея финальную ссылку, можно делать к ней get-запросы с помощью библиотеки requests, а содержимое запроса (HTML-разметку) передавать в Beautiful Soup:
Таким образом, мы получаем ссылки на каждого из интересующих нас продавцов и количество проданных товаров. Особенностью такого подхода является одинаковая разметка для всех ссылок, но в то же время разное содержание сущностей внутри (у продавцов разные названия, разное количество проданных товаров, разный рейтинг и т.д…) Начнем с количества товаров: согласно разметке запись содержится в тэге span класса goods_count. Вывод через print используем для проверки того, что все делаем правильно. Для случая количества товаров больше 9, то есть двузначного числа, добавим джойн:
Результат работы выглядит следующим образом:
Как видим, для первого продавца всё прошло успешно, а вот для второго уже поймали ошибку… Данная ошибка связана с тем, что второго продавца попросту не существует. То есть раньше там существовали записи, но по неведомой нам причине продавец покинул Wildberries:
Для того чтобы работа скрипта не завершалась ошибкой каждый раз при подобной ситуации, обработаем эту ошибку с помощью конструкции try - except. В блоке try мы выполняем инструкцию, которая может породить исключение, а в блоке except мы перехватываем их. При этом перехватываются как само исключение, так и его потомки:
Во фрагменте кода выше добавлено название компании (извлекли из класса breadcrumbs), обработка исключений в обоих ситуациях. В случае вывода исключений записываем в список seller_row просто пробел.
Остаётся только записать полученный список в файл:
Закрыть файл и закончить работу программы:
Результат:
Если скрипт работает верно, то заполненная страница будет только по адресу, а остальные пустые. При проверке оказалось, что это правда. Давайте попробуем взять айдишники с номерами побольше (от 20 000), чтобы получить более заполненный файл на выходе:
Таким образом, нам удалось получить всю нужную информацию, не пользуясь API, не собирая информацию вручную. Далее можно просто менять айди продавцов в цикле и названия файлов, а скрипт будет собирать информацию за вас, освободив время для выполнения других дел :)
Полная версия кода:
Вот и всё! В дальнейшем вы можете применять этот метод для решения других задач, поняв принцип разметки :)