Задать вопрос

Парсинг (скрапинг) получение информации с сайтов, авторизация, инструменты, примеры?

Доброго времени суток!

Запутался совсем, помогите разобраться или пните в нужную сторону.

В общем проблема заключается в следующем:
-Есть сайты которые выдают информацию
-На сайтах работает javascript + html, некоторые вообще на React крутятся там садомия в запросах от браузера к серверу происходит
-На сайтах необходимо пройти авторизацию
-Информация получается по средствам скачивания файлов либо так статический html который подгружается ajax'ом
-На некоторых присутствует капча как гугл так и обычная в виде картинка введите символы (картинки подгружаются после загрузки страницы)

Как я вижу решения вопроса, приложение на Spring boot крутится на сервере пользователи через телеграмм отправляют запросы получают информацию и остаются довольные.

Побывал сделать через RestTempalate строил логику сохранял куки, но столкнулся с проблемой javascript не отрабатывает и в случае с ресурсами на React не смог отследить установку всех кук которые ресурс устанавливает в браузер, получил отказ доступа. С запросами POST, GET все идеально где присутствуют формы.

Побывал сделать через HtmlUnit вроде все красиво описано поддержка javascript, css вменяема навигация, но балин при первом же запросе куча ошибок и капча для авторизации не подгружается...
2020-11-21 11:29:58.296  INFO 17496 --- [  restartedMain] com.ssnbuild.ssn.Application             : Started Application in 5.129 seconds (JVM running for 7.907)
2020-11-21 11:30:35.988 ERROR 17496 --- [legram Executor] c.g.h.javascript.StrictErrorReporter     : runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: :x).] sourceName=[https://info.is/media/bower_components/jquery/dist/jquery.min.js] line=[2] lineSource=[null] lineOffset=[0]
2020-11-21 11:30:36.701  INFO 17496 --- [legram Executor] c.g.h.javascript.JavaScriptEngine        : Caught script exception

com.gargoylesoftware.htmlunit.ScriptException: URIError: Malformed URI sequence. (https://info.is/media/dist/js/main.js#1)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:921) ~[htmlunit-2.23.jar:2.23]

......

2020-11-21 11:30:37.059 ERROR 17496 --- [legram Executor] c.g.h.javascript.StrictErrorReporter     : error: message=[missing ) after formal parameters] sourceName=[https://info.is/media/js/login.js] line=[1] lineSource=[var _0x295d=['\x77.тут много краказябр js кода >10к символов\x35')](doRestore);}});continue;case'\x35':_0x1a7d78[_0x4a84('0x196','\x73\x52\x4a\x4b')](renewCaptcha);continue;}break;}});] lineOffset=[62091]
2020-11-21 11:30:37.065  INFO 17496 --- [legram Executor] c.g.h.javascript.JavaScriptEngine        : Caught script exception

com.gargoylesoftware.htmlunit.ScriptException: missing ) after formal parameters (https://info.is/media/js/login.js#1)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:921) ~[htmlunit-2.23.jar:2.23]
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:628) ~[htmlunit-core-js-2.23.jar:na]
	at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:515) ~[htmlunit-core-js-2.23.jar:na]

....


2020-11-21 11:30:37.075  INFO 17496 --- [legram Executor] c.g.h.javascript.JavaScriptEngine        : Caught script exception

com.gargoylesoftware.htmlunit.ScriptException: URIError: Malformed URI sequence. (https://info.is/media/dist/js/main.js#1)
	at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:921) ~[htmlunit-2.23.jar:2.23]
	at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:628) ~[htmlunit-core-js-2.23.jar:na]


Посмотрел в сторону Silenium но там большие надстройки, необходим браузер и т.д

Поэтому решил спросить у Вас... Кто то чем то может пользовался решал подобные вопросы, или что нить почитать адекватное такое для деревянных что бы понятно было как работать с компонентом.

В идеале мне хотелось бы видеть виртуальный браузер с возможностью заполнения форм получением элементов DOM ну и что бы там без моего присутсвия отрабатывался javascript предусмотренный разработчиками.

Поможите чем можите... пожалуйста :)
  • Вопрос задан
  • 1018 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Здравствуйте!
Начнем с простого, когда контент сайта загружается без фреймворков. Соответственно, нет никаких аяксов, не нужно никуда скроллить, чтобы получить следующую страницу или кликать на кнопки и т.д. для получения материалов. Т.е. вам достаточно отправить GET запрос на некий сайт и получить данные.
В этом случае для парсинга будет достаточно библиотеки jsoup. Либо для своей кастомной реализации используйте DOM & SAX Parser.

Теперь, чуть усложним задачу сайт точно также формируется без фреймворков, но для получения доступа к информации нужна авторизация. Если тут используется какая-то простая авторизация, то достаточно будет единожды получить кукисы и при каждом запросе указывать на сервер. Также не забывайте про referrer & User-agent.

Теперь, еще усложним задачу - контент формируется динамически (посредством js-фреймворков или аякс запроса и т.д.). В этом случае jsoup не поможет, так как для загрузки контента вам нужно прокликать на кнопку (Загрузить еще) или проскроллить вниз, чтобы тригернуть загрузку контента и т.д. Т.е. вам нужна некая интерактивность. Для этого стоит посмотреть в сторону Selenium + (любой браузер). В качестве браузера можно использовать - firefox, chromium и др. Для быстродействия желательно использовать headless браузеры.

Усложняем задачу дальше. Понадобилось авторизоваться и решить некую капчу. В часности рекапчу. Тут скажу заранее, что я сам когда-то давно искал возможные пути обхода и самое простое решение - использовать платный сервис.
Ссылка на сайт - https://anti-captcha.com/
После ввода имени пользователя и пароля селениум триггерит клик на капче, а дальше данные пересылаем на сервер и получаем решение капчи.

Усложним задачу еще больше - различные honeypot. Тут как говорится кто на что горазд. Все зависит от конкретного сайта и конкретной реализации (софта) honeypot. Некоторые могут заблокировать по ip, если запрос был произведен на несуществующий урл. Например, на сайте всего 100 страниц, а вы запросили 101 страницу и попались в ловушку. Или например, вы заполнили невидимое input поле, которое в норме пользователь не видит и соответственно, не заполняет.

Идем дальше - если вам нужна некая интерактивность (т.е. пользователь сайта должен иметь возможность самостоятельно парсить сайт), то вам нужна клиентская часть написанная на javascript. Подобные онлайн-сервисы имеются. Наберите в гугл web scraping online и увидите различные сервисы. Как правило, они предлагают установить некое расширение, при клике на котором он получает доступ к элементам DOM, а далее уже можно при помощи селекторов (id, xpath, class ) определить что нужно спарсить. Определить тип навигации / пагинации (например, пагинация при помощи нумерации страниц или пагинация при помощи кнопки Далее и др.). Тут могут свои подводные камни. Например, некоторые сайты при достижении максимальной страницы могут выдавать ошибку (404), некоторые не выдают ошибку и лишь показывают контент заново. Иногда нужно проверять страницу на наличие пустоты на странице (на отсутствие элементов по селектору). Иногда нужно проверять страницу на наличие ошибки 404 и т.д. В общем, это уже работа фронтэндера.

Некоторые динамически формируемые страницы могут подгружать контент при помощи json или xml. Соответственно, для парсинга некоторых сайтов можно обойтись без использования selenium. А лишь запросить материалы по их внутреннему API, а затем при помощи gson или jackson спарсить их.

Одним из универсальных инструментов парсинга, с которым мне приходилось сталкиваться была программа Visual Web Ripper. Стоит примерно 250-300 долларов. Программа подгружает контент сайта внутри себя через IE (может уже и обновили этот момент). А далее уже можно задавать условия парсинга и экспортировать данные.
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
Существуют расширения для браузеров, которые позволяют запускать произвольный JavaScript на сайтах, просто используйте их. Ваша задача сведется к тому, что бы набросать скрипт, который заполняет поля и жмет кнопки, после чего полученный UserScript запустить через одно из выше описанных расширений на целевом сайте.

Да даже больше скажу, при желании можно и без расширений обойтись - просто открывайте консоль браузера, вставляйте и запускайте там какой-угодно JavaSscript, в том числе можно и запустить код для парсинга чего-то.
Ответ написан
MvcBox
@MvcBox
Software Engineer [C/C++/JS(for Node.js)/etc]
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы