Анализиране на онлайн магазини
Нека разделим парсинга (изстъргването) на сайтовете на две подзадачи.
- Самият анализ е търсене на данни, които ни интересуват на страниците.
- Разбиране на получените данни.
Първо, нека да опишем приложенията:
- Анализатор на "постоянна" информация за продукти от сайта. Този анализатор рядко ще се изпълнява (само за да проверява за нови продукти), ще анализира страници и ще извлича информация за продукта от тях: име, снимки, свойства.
- Анализатор на условно променлива информация. Това приложение ще се стартира често и автоматично, ще анализира страниците на сайта, за да търси цени и наличност в склада, за да актуализира тази информация в базата данни (няма да я разглеждаме, тук няма нищо необичайно).
- Административен панел, структуриращ получените данни. Това приложение ще бъде стартирано след анализатора на "постоянна" информация и позволява на администратора да анализира/структурира получените данни.
Така че нека да поговорим за парсери
Има много методи за синтактичен анализ, това са регулярни изрази и банално търсене на поднизове. Всички тези методи имат един голям недостатък - с малки промени в сайта, трябва да редактирате самия анализатор.
За себе си (пиша под .net в c #) се спрях на библиотеката HtmlAgilityPack, например описание на Habré.
Това, което прави, е, че чете HTML (дори много невалидни документи) и изгражда DOM дърво. И тогава цялата мощ на XPATH заявките влиза в игра. При правилно написани XPATH заявки няма нужда да редактирате парсера при смяна на сайта.
Пример:
Класовете често се използват за ориентиране в DOM, но още по-често незначителни промени в дизайна на сайта се извършват чрез добавяне на подходящи класове към елементите (от class = "productInfo" до class = "productInfo clearfix"). Следователно в XPATH е по-добре да напишете:
Да, това може да повлияе на производителността, но не много. Универсалността на кода е по-важна.
По същия начин, когато се ориентирам в дърво с помощта на идентификатори на елементи, аз съм склонен да използвам "//" (т.е. търсене в цялото поддърво) вместо "/" (търсене само сред деца). Това спестява в ситуации, в които дизайнерът обгръща някои тагове (като правило, за да поправи някакъв вид грешка в дисплея):
Следващият въпрос е "какво да се анализира?"
Трябва да анализираме основна информация за стоките: име, снимка и най-важното списък със свойства. Ще съхраняваме получените данни в база данни с примитивна структура:

Тези. за всеки продукт ще има списък с двойки стойности: име на свойство (свойствоНаименование) и неговата стойност (свойствоЗначение).