Как парсить сайты на java
Пишем парсер на Java + MySQL
База данных
Скрин структуры базы из PhpMyAdmin
Итак, сначала парсер.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ProxyHunter <
И непосредственно сам чекер
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ProxyHunter <
Вообще, меня терзают сомнения по поводу правильности реализации массива с потоками. Думается, что в Java есть что-то специальное для таких целей, но я реализовал первое что пришло в голову — массив потоков.
И не ругайте за изобретение велосипеда. Тут цель была just for fun плюс с MySQL’ем поработать. Для красоты вывода этого добра в консоль можно закоментировать все PrintStackTrace()’ы.
Обход и анализ веб-сайта на Java с помощью JSoup
Существует множество сценариев, в которых вам потребуется проанализировать содержимое веб-сайта для извлечения данных…. С тегами java, jsoup, синтаксический анализатор.
Существует множество сценариев, в которых вам потребуется проанализировать содержимое веб-сайта для извлечения данных. Поисковые системы делают это, некоторым приложениям требуется эта функциональность для извлечения информации, существуют интеграционные тесты, которые нуждаются в этом, и даже некоторые инструменты должны обладать этой функциональностью. В этой статье я покажу, как создать искатель веб-сайтов на Java и как анализировать содержимое веб-сайта и извлекать из него информацию.
Статья, первоначально опубликованная на моем личном веб-сайте в разделе Как проанализировать веб-сайт на Java
Создание всего синтаксического анализатора довольно сложно, но, к счастью, уже существует библиотека, которая выполняет сложные части за нас: JSoup. Он предоставляет все необходимые инструменты и API для анализа и извлечения данных веб-сайта. Он довольно прост в использовании и освоении, что делает его идеальным для большинства подобных приложений.
Установление соединения с помощью JSoup
Для примеров я буду использовать свой собственный веб-сайт. Итак, давайте начнем. Во-первых, мы должны установить соединение с веб-сайтом и получить HTML-документ. Вот как мы подключаемся к сайту и анализируем DOM с помощью JSoup.
Мы могли бы использовать упрощенную версию, используя только Jsoup.connect(” https://petrepopescu.tech “).get( ), но я выбрал более сложную версию, чтобы показать шаги, которые выполняет библиотека. Кроме того, мы можем легко использовать дополнительные функции, такие как настройка агента пользователя (Jsoup.connect(url).UserAgent(агент)) или прокси-сервера (connection.proxy(хост, порт)), функции, которые очень удобны при выполнении полного анализа сайта, потому что это сводит к минимуму вероятность блокировки вашего приложения их брандмауэром.
Анализ элементов веб-сайта
Теперь, когда мы успешно установили соединение и JSoup проанализировал страницу, давайте попробуем идентифицировать элементы на странице и получить их содержимое. В первом примере я буду извлекать категории и ссылки на конкретные страницы. Используя инспектор браузера, мы можем видеть, что категории представлены в виде элементов списка, которые находятся внутри div с идентификатором категории 3.
Такой же подход можно применить практически к любому веб-сайту и элементу на странице, чтобы определить необходимые критерии идентификации.
Если возможно, всегда используйте идентификаторы, так как они уникальны на странице или, по крайней мере, должны быть уникальными. Если этого недостаточно, вы можете сделать выбор по классу, типу и простой навигации в структуре страницы, чтобы получить именно тот элемент, который вам нужен. Это именно то, что мы собираемся сделать сейчас, чтобы найти все ссылки на категории и названия категорий.
Сначала мы найдем элемент с идентификатором категории-3, а затем мы будем искать элементы списка, выполняя поиск элементов с тегом li. из этих элементов мы получаем атрибут href и текст. Наконец, мы печатаем товары.
Использование селектора в JSoup для извлечения элемента
Иногда бывает не так просто получить именно тот элемент, который вы хотите. У него нет идентификатора, или несколько элементов имеют один и тот же идентификатор, или, возможно, идентификатор является динамическим. Например, статьи, представленные на первой странице, имеют уникальный идентификатор, который создается для каждой отдельной статьи следующим образом: “post-“. Что, если вы хотите получить отрывок для каждого из них? Именно здесь в игру вступает метод select из JSoup. Вы можете написать сложный селектор, который поможет с идентификацией и извлечением нужного вам элемента.
Например, это один из способов получить выдержки с первой страницы.
Если мы хотим быть еще более конкретными, мы можем получить все элементы типа article с идентификатором, как описано выше, используя более сложный селектор. Поскольку это занимает немного больше времени из-за регулярного выражения, мы можем немного оптимизировать его, выполнив поиск только внутри div с фактическим содержимым, а не на всей странице. Для этого мы просто заменим первую строку следующей: Elements.getElementById (“сетка-оболочка”).select(“статья[идентификатор
В JSoup доступно еще больше селекторов, которые должны удовлетворить все ваши потребности. Вы можете прочитать о них на официальном сайте JSoup. Просто будьте осторожны, когда используете их, так как некоторые из них быстрее других. Убедитесь, что вы всегда пытаетесь оптимизировать поиск, продвигаясь как можно ниже по структуре, а не выполняя поиск по всей странице.
Выводы
Как мы видим, JSoup предлагает все необходимые инструменты для успешного анализа веб-страницы и извлечения из нее данных и информации. Приложив немного усилий и немного знаний, вы сможете извлекать информацию с большинства веб-сайтов, проверять структуру своей веб-страницы в интеграционных тестах или создавать потрясающий инструмент, который отслеживает цену товара.
И, как всегда, вы можете скачать полный исходный код с моего сайта
Статья, первоначально опубликованная на моем личном веб-сайте в разделе Как проанализировать веб-сайт на Java
Как парсить и распарсить JSON на Java: способы и методы с примерами
Парсинг, JSON и Java — три термина, которые сошлись в одном месте, чтобы облегчить жизнь программисту. Напомним:
JSON — это формат сохранения данных. JSON хранит информацию в виде текста, но делает это, используя определенную структуру. JSON создан для того, чтобы людям было проще читать сохраняемые сведения. JSON разработан с использованием JavaScript и расшифровывается как «JavaScript Object Notation». Структура сохранения информации в JSON строится с использованием пары «ключ-значение».
Java — это один из самых популярных языков программирования, на котором можно разработать како е у годно приложение. Приложения на Java кроссплатформенны е — это значит, что приложение пишется один раз, а запускается на любой операционной системе, которая поддерживает виртуальную машину Java.
Парсинг JSON на Java
JSON — это довольно распространенная структура, которая часто используется и в java-приложениях.
Создадим небольшую структуру JSON и проведем над ней парсинг, используя возможности Java. Наш JSON-документ:
«author_name»: «Дормидонт Платонович»,
«mypost_title»: «Как парсить JSON на Java»,
Есть несколько способов, чтобы наладить парсинг JSON на Java. Для примера, мы будем парсить из нашего « джсон » значения «myPageName» и «mypost_id».
Парсинг JSON с использованием Java при помощи инструмента «org.json»
Чтобы воспользоваться «org.json» в Джава-парсинге, в первую очередь внедряем в программный скрипт соответствующий одноименный инструмент.
Джава-парсер « джсон » в подобной интерпретации будет выглядеть вот так:
public class MyParseJSON <
static myString myjson = «. «;
public static void main(myString[] args) <
JSONObject obj = new JSONObject(myjson);
myString myPageName = obj.getJSONObject(«myPageInfo»).getmyString(«myPageName»);
JSONArray arr = obj.getJSONArray(«myPosts»);
myString mypost_id = arr.getJSONObject(i).getmyString(«mypost_id»);
Парсинг JSON с использованием Джава и «Gson»
Джава-парсер « джсон » в подобной интерпретации будет выглядеть вот так:
public class MyParseJSON <
static myString myjson = «. «;
public static void main(myString[] args) <
JsonObject jsonObject = new myJsonParser().parse(myjson).getAsJsonObject();
myString myPageName = jsonObject.getAsJsonObject(«myPageInfo»).get(«myPageName»).getAsMyString();
JsonArray arr = jsonObject.getAsJsonArray(«myPosts»);
myString mypost_id = arr.get(i).getAsJsonObject().get(«mypost_id»).getAsMyString();
Парсинг « джсон » с использованием Джава и «JsonPATH»
Чтобы спарсить « джсон », воспользовавшись Джава и «JsonPATH», необходимо подключить одноименный инструмент в программный скрипт.
Java-парсер JSON в подобной интерпретации будет выглядеть вот так:
public class MyParseJSON <
static myString myjson = «. «;
public static void main(myString[] args) <
myString myPageName = JsonPath.read(myjson, «$.myPageInfo.myPageName»);
Integer myPosts = JsonPath.read(myjson, «$.myPosts.length()»);
myString mypost_id = JsonPath.read(json, «$.myPosts[» + i + «].mypost_id»);
Заключение
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Инструменты и библиотеки для веб-скрейпинга
Автор — Мария Багулина
Собирать данные с веб-сайтов (то есть заниматься веб-скрейпингом) можно либо через готовый API, либо путём парсинга. Самостоятельно парсить страницы не всегда просто: многие сайты не любят скрейперов и стараются блокировать их. Мы уже рассказывали, как этого избежать, а в этой статье рассмотрим готовые инструменты для парсинга, среди которых наиболее популярные онлайн-сервисы и библиотеки для языков Python, JavaScript, Java.
Онлайн-сервисы для скрейпинга
Готовые веб-интерфейсы обычно избавляют ото всех хлопот, возникающих во время парсинга веб-страниц. Но по этой же причине большинство из них — платные. Среди примеров:
Scraping-Bot — веб-инструмент, хорошо заточенный под анализ интернет-магазинов: можно легко извлекать изображения, наименования, цены, описания, стоимость доставки и прочую информацию.
Scrapeworks — подойдёт тем, кто не знаком с программированием. Позволяет получать данные со страниц в структурированном формате на ваш выбор.
Diggernaut — парсер, создаваемый с помощью визуального инструмента или метаязыка. Может читать данные из HTML, XML, JSON, iCal, JS, XLSX, XLS, CSV, Google Spreadsheets.
ScrapingBee — предоставляет API для работы с Headless Chrome и позволяет сфокусироваться на обработке данных.
Scraper API — ещё один простой API с большим набором настроек: от заголовков запросов до геолокации IP.
Библиотеки для языков программирования
Python
Библиотеки на Python предоставляют множество эффективных и быстрых функций для парсинга. Многие из этих инструментов можно подключить к готовому приложению в формате API для создания настраиваемых краулеров. Все перечисленные ниже проекты имеют открытый исходный код.
BeautifulSoup
Пакет для анализа документов HTML и XML, преобразующий их в синтаксические деревья. Он использует HTML и XML-парсеры, такие как html5lib и Lxml, чтобы извлекать нужные данные.
Для поиска конкретного атрибута или текста в необработанном HTML-файле в BeautifulSoup есть удобные функции find(), find_all(), get_text() и другие. Библиотека также автоматически распознаёт кодировки.
Установить последнюю версию BeautifulSoup можно через easy_install или pip:
Selenium
Инструмент, который работает как веб-драйвер: открывает браузер, выполняет клики по элементам, заполняет формы, прокручивает страницы и многое другое. Selenium в основном используется для автоматического тестирования веб-приложений, но его вполне можно применять и для скрейпинга. Перед началом работы необходимо установить драйверы для взаимодействия с конкретным браузером, например ChromeDriver для Chrome и Safari Driver для Safari 10.
Установить Selenium можно через pip:
Библиотека с удобными инструментами для обработки HTML и XML файлов. Работает с XML чуть быстрее, чем Beautiful Soup, при этом используя аналогичный метод создания синтаксических деревьев. Чтобы получить больше функциональности, можно объединить Lxml и Beautiful Soup, так как они совместимы друг с другом. Beautiful Soup использует Lxml как парсер.
Ключевые преимущества библиотеки — высокая скорость анализа больших документов и страниц, удобная функциональность и простое преобразование исходной информации в типы данных Python.
JavaScript
Для JavaScript тоже можно найти готовые библиотеки для парсинга с удобными функциональными API.
Cheerio
Шустрый парсер, который создаёт DOM-дерево страницы и позволяет удобно с ним работать. Cheerio анализирует разметку и предоставляет функции для обработки полученных данных.
API Cheerio будет особенно понятен тем, кто работает с jQuery. Парсер позиционирует себя как инструмент, позволяющей сконцентрироваться на работе с данными, а не на их извлечении.
Osmosis
По функциональности скрейпер похож на Cheerio, но имеет куда меньше зависимостей. Osmosis написан на Node.js и поддерживает селекторы CSS 3.0 и XPath 1.0. Также он умеет загружать и искать AJAX-контент, записывать логи URL-адресов, редиректов и ошибок, заполнять формы, проходить базовую аутентификацию и многое другое.
Для наглядности можно посмотреть пример парсинга сайтов с помощью Osmosis.
Apify SDK
Библиотека Node.js, которую можно использовать вместе с Chrome Headless и Puppeteer.
Apify позволяет выполнять глубокий обход всего веб-сайта, используя очередь URL-адресов. Также с ней можно запускать код парсера для множества URL в CSV-файле, не теряя никаких данных при сбое программы.
Для безопасного скрейпинга Apify использует прокси и отключает распознавание фингерпринта браузера на веб-сайтах.
Установить Apify SDK:
В Java реализованы различные инструменты и библиотеки, а также внешние API, которые можно использовать для парсинга.
Jsoup
Проект с открытым исходным кодом для извлечения и анализа данных с HTML-страниц. Основные функции в целом не отличаются от тех, что предоставляют другие парсеры. К ним относятся загрузка и анализ HTML-страниц, манипулирование HTML-элементами, поддержка прокси, работа с CSS-селекторами и прочее.
Jsoup не поддерживает парсинг на основе XPath.
Jaunt
Библиотека, которую можно использовать для извлечения данных из HTML-страниц или данных JSON с помощью headless-браузера. Jaunt может выполнять и обрабатывать отдельные HTTP-запросы и ответы, а также взаимодействовать с REST API для извлечения данных.
В целом функциональность Jaunt похож на Jsoup за исключением того, что вместо CSS-селекторов Jaunt использует собственный синтаксис.
HTMLUnit
Инфраструктура, которая позволяет моделировать события браузера, (щелчки, прокрутка, отправка форм) и поддерживает JavaScript. Это улучшает процесс автоматизации получения и обработки информации. HTMLUnit поддерживает парсинг на основе XPath, в отличие от JSoup. Ещё его можно использовать для модульного тестирования веб-приложений.
Знаете ещё примеры хороших библиотек и инструментов для скрейпинга? Поделитесь ими в комментариях.
Как спарсить любой сайт?
Меня зовут Даниил Охлопков, и я расскажу про свой подход к написанию скриптов, извлекающих данные из интернета: с чего начать, куда смотреть и что использовать.
Написав тонну парсеров, я придумал алгоритм действий, который не только минимизирует затраченное время на разработку, но и увеличивает их живучесть, робастность, масштабируемость.
Чтобы спарсить данные с вебсайта, пробуйте подходы именно в таком порядке:
Найдите официальное API,
Найдите XHR запросы в консоли разработчика вашего браузера,
Найдите сырые JSON в html странице,
Отрендерите код страницы через автоматизацию браузера,
Совет профессионалов: не начинайте с BS4/Scrapy
Крутые вебсайты с крутыми продактами делают тонну A/B тестов, чтобы повышать конверсии, вовлеченности и другие бизнес-метрики. Для нас это значит одно: элементы на вебстранице будут меняться и переставляться. В идеальном мире, наш написанный парсер не должен требовать доработки каждую неделю из-за изменений на сайте.
Приходим к выводу, что не надо извлекать данные из HTML тегов раньше времени: разметка страницы может сильно поменяться, а CSS-селекторы и XPath могут не помочь. Используйте другие методы, о которых ниже. ⬇️
Используйте официальный API
Поищите XHR запросы в консоли разработчика
Все современные вебсайты (но не в дарк вебе, лол) используют Javascript, чтобы догружать данные с бекенда. Это позволяет сайтам открываться плавно и скачивать контент постепенно после получения структуры страницы (HTML, скелетон страницы).
В итоге, даже не имея официального API, можно воспользоваться красивым и удобным закрытым API. ☺️
Даже если фронт поменяется полностью, этот API с большой вероятностью будет работать. Да, добавятся новые поля, да, возможно, некоторые данные уберут из выдачи. Но структура ответа останется, а значит, ваш парсер почти не изменится.
Алгорим действий такой:
Открывайте вебстраницу, которую хотите спарсить
Открывайте вкладку Network и кликайте на фильтр XHR запросов
Обновляйте страницу, чтобы в логах стали появляться запросы
Найдите запрос, который запрашивает данные, которые вам нужны
Копируйте запрос как cURL и переносите его в свой язык программирования для дальнейшей автоматизации.
Кнопка, которую я искал месяцы
Поищите JSON в HTML коде страницы
Как было удобно с XHR запросами, да? Ощущение, что ты используешь официальное API. 🤗 Приходит много данных, ты все сохраняешь в базу. Ты счастлив. Ты бог парсинга.
Но тут надо парсить другой сайт, а там нет нужных GET/POST запросов! Ну вот нет и все. И ты думаешь: неужели расчехлять XPath/CSS-selectors? 🙅♀️ Нет! 🙅♂️
Чтобы страница хорошо проиндексировалась поисковиками, необходимо, чтобы в HTML коде уже содержалась вся полезная информация: поисковики не рендерят Javascript, довольствуясь только HTML. А значит, где-то в коде должны быть все данные.
Современные SSR-движки (server-side-rendering) оставляют внизу страницы JSON со всеми данные, добавленный бекендом при генерации страницы. Стоп, это же и есть ответ API, который нам нужен! 😱😱😱
Вот несколько примеров, где такой клад может быть зарыт (не баньте, плиз):
Красивый JSON на главной странице Habr.com. Почти официальный API! Надеюсь, меня не забанят.
И наш любимый (у парсеров) Linkedin!
Алгоритм действий такой:
В dev tools берете самый первый запрос, где браузер запрашивает HTML страницу (не код текущий уже отрендеренной страницы, а именно ответ GET запроса).
Внизу ищите длинную длинную строчку с данными.
Вырезаете JSON из HTML любыми костылямии (я использую html.find(«=<") ).
Отрендерите JS через Headless Browsers
Если коротко, то есть инструменты, которые позволяют управлять браузером: открывать страницы, вводить текст, скроллить, кликать. Конечно же, это все было сделано для того, чтобы автоматизировать тесты веб интерфейса. I’m something of a web QA myself.
После того, как вы открыли страницу, чуть подождали (пока JS сделает все свои 100500 запросов), можно смотреть на HTML страницу опять и поискать там тот заветный JSON со всеми данными.
Для масштабируемости и простоты, я советую использовать удалённые браузерные кластеры (remote Selenium grid).
Вот так я подключаюсь к Selenoid из своего кода: по факту нужно просто указать адрес запущенного Selenoid, но я еще зачем-то передаю кучу параметров бразеру, вдруг вы тоже захотите. На выходе этой функции у меня обычный Selenium driver, который я использую также, как если бы я запускал браузер локально (через файлик chromedriver).
Парсите HTML теги
Если случилось чудо и у сайта нет ни официального API, ни вкусных XHR запросов, ни жирного JSON внизу HTML, если рендеринг браузерами вам тоже не помог, то остается последний, самый нудный и неблагодарный метод. Да, это взять и начать парсить HTML разметку страницы. То есть, например, из Cool website достать ссылку. Это можно делать как простыми регулярными выражениями, так и через более умные инструменты (в питоне это BeautifulSoup4 и Scrapy) и фильтры (XPath, CSS-selectors).
Мой единственный совет: постараться минимизировать число фильтров и условий, чтобы меньше переобучаться на текущей структуре HTML страницы, которая может измениться в следующем A/B тесте.
Подписывайтесь на мой Телеграм канал, где я рассказываю свои истории из парсинга и сливаю датасеты.
