Проблемы извлечения информации с веб-страниц автоматизированным способом

в 10:57, , рубрики: curl, html, phantomjs, scraping, xpath, веб-аналитика, поисковые технологии

Информация, находящаяся в свободном доступе на веб-сайтах сети Интернет, с одной стороны, кажется общедоступной — если что-то выложено в сеть, то это можно скопировать тем или иным способом. С другой — при попытках автоматизировать сбор и анализ таких данных с какой-нибудь целью (например веб-поиска или статистики), как оказывается, возникает множество проблем в деталях. Поэтому не удивительно, что успешные системы такого рода единичны в глобальном масштабе — Google, Bing, Baidu и Яндекс. В данной статье приведу некоторые примеры с которыми столкнулся лично автор в попытках отладить сбор данных о рынке труда (вакансии, резюме и зарплаты) с публичных веб-сайтов. Это может пригодиться тем, кто вдохновится идеями типа I Don't Need No Stinking API: Web Scraping For Fun and Profit и решит парсить контент с чужих сайтов напрямую вместо того, чтобы договориться с владельцами о доступе к данным по API или другим эффективным способом.

Простые изменения контента

Предположим, вы написали функцию, которая получает с веб-страницы Центрального Банка текущие курсы валют. Ваша функция разбирает html-код данной страницы, находит в нем таблицу с курсами валют, в ней 11 и 12 строки, и берет из них курсы доллара и евро соответственно. Функция будет работать ровно до тех пор, пока Центральный Банк не введет еще один курс валют и не поместит его, например, первой строкой. В этот момент ваша функция начнет в качестве курса евро брать курс доллара, а вместо курса доллара курс датских крон, вы об этом никак не узнаете, а ваша система начнет собирать неправильные данные и возможно делать на их основе неправильные выводы.

Изменения структуры html-кода или адресов веб-страниц

Это редкое, но зато глобальное изменение, которое полностью сломает вашу автоматизированную систему — код, который ранее успешно переходил по страницам, ссылкам, извлекал из них информацию на основе html, перестанет работать. А если вы считали контрольные суммы для контента, который собираете, чтобы не сохранять у себя в базе данных дубли, то эти контрольные суммы также изменятся, и вы успешно сохраните их (дублей) большое количество. Таким образом ваша система полностью перестанет собирать данные, пока вы вручную не отладите её на новой структуре, а когда отладите, то не сможете синхронизировать данные, и достоверность выводов, сделанных на основе этих данных, опять сильно пострадает.

Переадресация и https

Стоит быть внимательным к работе самого http-протокола — можно столкнуться с тем, что запрашиваемый url (например http://site.ru/vacancy/379142) возвращает не 200 код и html-контент, а код 301 и заголовок "Location: http://site.ru/vacancy/379142/", на который нужно перейти для получения собственно контента. Также http не единственное возможное начало адреса — в последнее время сайты предпочитают обращение по https. Если вы не учли эти моменты, то ваш сбор данных также перестанет работать.

Заголовок User Agent

Это заголовок запроса, в котором клиент передает сведения о себе. Если не передаете ничего или передаете что-то не имеющее отношение к браузерам, то сервер может вам не ответить или ответить вместо нужного контента сообщением "Вы используете устаревший браузер, пожалуйста обновитесь". При первой отладке вы это явно заметите, но если изменения на стороне сервера произойдут уже позже — в режиме регулярной ежедневной эксплуатации вашей системы — вы сможете это заметить только по отсутствию ожидаемых данных, если вы это отслеживаете, конечно.

Ошибки в html

Предположим, что вы используете для извлечения информации из html-кода xpath-селекторы, которые успешно отладили и они работали на тестовых данных. Но на реальных данных вы можете столкнуться с тем, что html-код на вход вашей системы поступает с ошибками в структуре — например, с незакрытым тегом ссылки или закрытым в некорректном месте. Движки популярных браузеров эту ситуацию исправляют автоматически, пользователи сайта информацию видят, разработчики сайта тоже считают, что все ОК, а ваша автоматизированная система уже не может справиться с этим контентом, так как нарушена структура и нужный контент не находится по запрограммированному вами xpath.

Javascript и динамический html

В последние годы веб-сайты вместо относительно статичных технологий html и css, которые генерировались и передавались с сервера клиенту в готовом виде, стали использовать также и динамическую генерацию html на стороне клиента (т.е. браузера). В этом случае с сервера поступает только некоторый базовый каркас на html + javascript-код, который выполняется уже на стороне браузера, а данные для отображения пользователю поступают с сервера в формате json. Таким образом, для автоматизации сбора уже не достаточно отправить http-запрос, получить ответ в виде html и извлечь из него нужную информацию — вам нужен браузер, чтобы обработать и выполнить javascript, иначе у вас не будет никакой информации. А выполнение кода на стороне клиента и использование браузера для этого замедляет работу системы в десятки раз.

Быстро меняющиеся технологии

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

Некоторые из вышеперечисленных проблем можно решить сделав обработку таких ситуаций в коде, другие — использованием "программного" браузера phantomjs, основанного на движке привычного пользовательского браузера, вместо прямых http-запросов библиотеки curl. Но все же все ситуации обработать и предусмотреть такими достаточно простыми способами, видимо, не получится, и нужно большое количество времени, накопление опыта и постоянные исследования возникающих ситуаций и собираемых данных, чтобы разработать систему, работающую с адекватной погрешностью и позволяющую делать какие-то выводы из собираемых таким способом данных.

Автор: VladimirKh

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js