Рубрики
Без рубрики

Очистка данных о Продуктах Электронной Коммерции

В этом уроке мы рассмотрим, как извлечь данные о продукте из любого электронного сообщения… Помеченный java, вебскрапингом.

В этом уроке мы рассмотрим, как извлекать данные о продукте с любых веб-сайтов электронной коммерции с помощью Java. Существует множество различных вариантов использования для извлечения данных о продукте, таких как:

  • Мониторинг цен электронной коммерции
  • Компаратор цен
  • Мониторинг доступности
  • Извлечение отзывов
  • Исследование рынка
  • Нарушение КАРТЫ

Мы собираемся извлечь эти различные поля: Цена, Название продукта, URL изображения, артикул и валюта с этой страницы продукта:

Мы собираемся извлечь эти различные поля: Цена, Название продукта, URL изображения, артикул и валюта с этой страницы продукта:

Что вам понадобится

Мы будем использовать HtmlUnit для выполнения HTTP-запроса и анализа DOM, добавим эту зависимость в ваш pom.xml .


   net.sourceforge.htmlunit
   htmlunit
   2.19

Мы также будем использовать библиотеку Джексона:


  com.fasterxml.jackson.core
  jackson-databind
  2.9.8

Мы также будем использовать библиотеку Джексона:

Чтобы извлечь интересующие нас поля, мы собираемся проанализировать https://schema.org метаданные из Html-разметки.

Схема – это семантический словарь, который можно добавить на любую веб-страницу. Реализация схемы имеет много преимуществ. Большинство поисковых систем используют его, чтобы понять, о чем страница (Продукт, статья, Обзор и многое другое )

В соответствии с schema.org , около 10 миллионов веб-сайтов используют его по всему миру. Это потрясающе! Существуют различные типы схем, и сегодня мы рассмотрим тип продукта

Это действительно удобно, потому что как только вы напишете скребок, который извлекает определенные данные схемы, он будет работать на любом другом веб-сайте, использующем ту же схему. Больше никаких конкретных селекторов XPath/CSS для написания!

По моему опыту работы в PricingBot (моей предыдущей компании), около 40% веб-сайтов электронной коммерции используют schema.org метаданные в их DOM.

Существует три основных схемы разметки:

JSON-ЛД


РДФ-А

315
Photo of product BRAND 502
руб 4 399,00
...
...

И тот, который используется в нашем примере, Микроданные :

Image 1 of The North Face Vault Backpack 28 Litres in Black 10253008 10253008 The North Face The North Face Vault Backpack 28 Litres in Black Shop The North Face Vault Backpack 28 Litres in Black at ASOS. Discover fashion online. 60 GB ASOS

Обратите внимание, что у вас может быть несколько предложений на одной странице.

Извлечение данных

Первое, что нужно сделать, это создать базовое POJO продукта:

public class Product {

    private BigDecimal price;
    private String name;
    private String sku;
    private URL imageUrl;
    private String currency;
        // ...getters & setters

Затем нам нужно перейти по целевому URL-адресу и создать базовый анализатор микроданных для извлечения интересующих нас полей. Для этого я использую HtmlUnit, который представляет собой чистый Java-браузер без головы. Я мог бы использовать множество разных библиотек, таких как Jsoup или Selenium + Безголовый Хром.

Но в большинстве случаев HtmlUnit является хорошим решением, потому что он легче, чем Selenium + Безголовый Chrome, но предлагает больше возможностей, чем необработанный HTTP-клиент + JSoup (который обрабатывает только синтаксический анализ Html).

Для веб-сайтов с “тяжелым Javascript”, опирающихся на интерфейсные фреймворки, такие как React/Vue.js , Безголовый Хром – это правильный путь!

WebClient client = new WebClient();
client.getOptions().setCssEnabled(false);
client.getOptions().setJavaScriptEnabled(false);
String productUrl = "https://www.asos.com/the-north-face/the-north-face-vault-backpack-28-litres-in-black/prd/10253008";

HtmlPage page = client.getPage(productUrl);
HtmlElement productNode = ((HtmlElement) page
                .getFirstByXPath("//*[@itemtype='https://schema.org/Product']"));
URL imageUrl = new URL((((HtmlElement) productNode.getFirstByXPath("./img")))
                .getAttribute("src"));
HtmlElement offers = ((HtmlElement) productNode.getFirstByXPath("./span[@itemprop='offers']"));

BigDecimal price = new BigDecimal(((HtmlElement) offers.getFirstByXPath("./span[@itemprop='price']")).asText());
String productName = (((HtmlElement) productNode.getFirstByXPath("./span[@itemprop='name']")).asText());
String currency = (((HtmlElement) offers.getFirstByXPath("./*[@itemprop='priceCurrency']")).getAttribute("content"));
String productSKU = (((HtmlElement) productNode.getFirstByXPath("./span[@itemprop='sku']")).asText());

В первых строках я создал HTTP-клиент HtmlUnit и отключил Javascript, потому что он нам не нужен для получения разметки схемы.

Тогда это просто базовые выражения XPath для выбора интересных узлов DOM, которые мы хотим.

Этот анализатор далек от совершенства, он не извлекает все и не обрабатывает несколько предложений. Однако это даст вам представление о том, как извлекать данные схемы.

Затем мы можем создать объект Product и распечатать его в виде строки JSON:

Product product = new Product(price, productName, productSKU, imageUrl, currency);
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(product) ;
System.out.println(jsonString);

Избегайте блокировки

Теперь, когда мы можем извлекать нужные нам данные о продукте, мы должны быть осторожны, чтобы нас не заблокировали.

По разным причинам на веб-сайтах иногда внедряются механизмы защиты от ботов. Наиболее очевидной причиной защиты сайтов от ботов является предотвращение влияния интенсивного автоматизированного трафика на производительность веб-сайта (и вы должны быть осторожны с одновременными запросами, добавляя задержки…). Другая причина заключается в том, чтобы остановить плохое поведение таких ботов, как спам.

Существуют различные механизмы защиты. Иногда ваш бот будет заблокирован, если он выполняет слишком много запросов в секунду/час/день. Иногда существует ограничение скорости на количество запросов на IP-адрес. Самая сложная защита – это когда есть анализ поведения пользователя. Например, веб-сайт может анализировать время между запросами, если один и тот же IP-адрес делает запросы одновременно.

Самое простое решение скрыть наши скребки – это использовать прокси-серверы. В сочетании со случайным агентом пользователя использование прокси-сервера является мощным способом скрыть наши скребки и очистить веб-страницы с ограниченной скоростью. Конечно, лучше не блокировать в первую очередь, но иногда веб-сайты разрешают только определенное количество запросов в день/час.

В этих случаях вам следует использовать прокси-сервер. Существует множество бесплатных списков прокси-серверов, я не рекомендую их использовать, потому что они часто медленные, ненадежные, и веб-сайты, предлагающие эти списки, не всегда прозрачны в отношении того, где расположены эти прокси-серверы. Иногда публичный список прокси-серверов управляется законной компанией, предлагающей прокси-серверы премиум-класса, а иногда и нет…

Я рекомендую использовать платный прокси-сервис, или вы можете создать свой собственный.

Настроить прокси-сервер на HtmlUnit очень просто:

ProxyConfig proxyConfig = new ProxyConfig("host", myPort);
client.getOptions().setProxyConfig(proxyConfig);

Идите дальше

Как вы можете видеть, благодаря Schema.org данные, извлечение данных о продукте сейчас намного проще, чем десять лет назад.

Но все еще существуют проблемы, такие как обработка веб-сайтов, на которых не реализована схема, обработка блокировки IP и ограничений скорости, рендеринг Javascript…

Именно поэтому мы работаем с моим партнером Пьером над API для очистки веб-страниц

ScrapingBee – это API для извлечения любого HTML-кода с любого веб-сайта без необходимости иметь дело с прокси, капчами и безголовыми браузерами. Один вызов API, содержащий только URL-адрес продукта, из которого вы хотите извлечь данные.

Надеюсь, вам понравился этот пост, как всегда, вы можете найти полный код в этом репозитории Github: https://github.com/ksahin/introWebScraping

Оригинал: “https://dev.to/scrapingbee/scraping-e-commerce-product-data-2aif”