Как "сканировать" веб-сайт (или страницу) для информации и вводить его в мою программу?
Ну, я в основном пытаюсь понять, как извлекать информацию с веб-страницы и переносить ее в мою программу (на Java).
Например, если я знаю точную страницу, на которой я хочу получить информацию, для простоты на странице "Лучшая покупка", как мне получить нужную информацию, которая мне нужна на этой странице? Как название, цена, описание?
Что бы этот процесс даже назывался? Я понятия не имел, что даже начинаю исследовать это.
Изменить:
Хорошо, я запускаю тест для JSoup (тот, который отправил BalusC), но я продолжаю получать эту ошибку:
Exception in thread "main" java.lang.NoSuchMethodError: java.util.LinkedList.peekFirst()Ljava/lang/Object;
at org.jsoup.parser.TokenQueue.consumeWord(TokenQueue.java:209)
at org.jsoup.parser.Parser.parseStartTag(Parser.java:117)
at org.jsoup.parser.Parser.parse(Parser.java:76)
at org.jsoup.parser.Parser.parse(Parser.java:51)
at org.jsoup.Jsoup.parse(Jsoup.java:28)
at org.jsoup.Jsoup.parse(Jsoup.java:56)
at test.main(test.java:12)
У меня есть Apache Commons
Ответы
Ответ 1
Используйте парсер HTML, например Jsoup. Это имеет предпочтение выше других парсеров HTML, доступных в Java, поскольку поддерживает jQuery, например селектора CSS. Кроме того, его класс, представляющий список узлов, Elements
, реализует Iterable
, чтобы вы могли прокручивать его в улучшенном для цикла (так что нет необходимости хлопотать с подробным Node
и NodeList
как классы в среднем парсе Java DOM).
Вот пример базового запуска (просто поместите последний JSup JAR файл в classpath):
package com.stackoverflow.q2835505;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Test {
public static void main(String[] args) throws Exception {
String url = "https://stackoverflow.com/questions/2835505";
Document document = Jsoup.connect(url).get();
String question = document.select("#question .post-text").text();
System.out.println("Question: " + question);
Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
System.out.println("Answerer: " + answerer.text());
}
}
}
Как вы могли догадаться, это печатает ваш собственный вопрос и имена всех ответчиков.
Ответ 2
Это называется очисткой экрана, в wikipedia есть эта статья о более специфическом веб-скрипинге. Это может быть серьезной проблемой, потому что там есть какой-то уродливый, беспорядочный, взломанный, если не для браузера, умный HTML, так что удачи.
Ответ 3
Сам процесс обычно называется "соскабливанием". Вы можете использовать парсер, например TagSoup для обработки страницы, как только вы ее извлекли.
Ответ 4
Я бы использовал JTidy - это похоже на JSoup, но я не очень хорошо знаю JSoup. JTidy обрабатывает разбитый HTML-код и возвращает документ w3c, поэтому вы можете использовать его как источник для XSLT для извлечения интересующего вас контента. Если вы не знаете XSLT, то вы также можете пойти с JSoup, поскольку документ модель лучше работать с чем w3c.
EDIT: быстрый просмотр веб-сайта JSoup показывает, что JSoup действительно может быть лучшим выбором. Кажется, он поддерживает селектора CSS из коробки для извлечения материала из документа. С этим легче работать, чем с XSLT.
Ответ 5
Вы можете использовать парсер html (здесь много полезных ссылок: java html parser).
Процесс называется "захват содержимого веб-сайта". Поиск "захватить содержимое веб-сайта java" для дальнейшей инверсии.
Ответ 6
jsoup поддерживает java 1.5
https://github.com/tburch/jsoup/commit/d8ea84f46e009a7f144ee414a9fa73ea187019a3
выглядит так, что стек был ошибкой и исправлен
Ответ 7
Вероятно, вам захочется взглянуть на HTML, чтобы узнать, можете ли вы найти строки, которые уникальны и рядом с вашим текстом, затем вы можете использовать строки / char -offsets для доступа к данным.
Может быть неудобно в Java, если нет классов XML, похожих на те, что найдены в System.XML.Linq
в С#.
Ответ 8
Решение JSoup отлично, но если вам нужно извлечь только что-то действительно простое, может быть проще использовать регулярное выражение или String.indexOf
Как уже упоминалось, процесс называется скребкой
Ответ 9
Вы также можете попробовать jARVEST.
Он основан на JRuby DSL над движком pure-Java для веб-сайтов с расширением sprap-scrape.
Пример:
Найти все ссылки внутри веб-страницы (wget
и xpath
являются конструкциями языка jARVEST):
wget | xpath('//a/@href')
Внутри программы Java:
Jarvest jarvest = new Jarvest();
String[] results = jarvest.exec(
"wget | xpath('//a/@href')", //robot!
"http://www.google.com" //inputs
);
for (String s : results){
System.out.println(s);
}
Ответ 10
Посмотрите на библиотеку cURL. Я никогда не использовал его в Java, но я уверен, что для него должны быть привязки. В основном, то, что вы сделаете, это отправить запрос cURL на любую страницу, которую вы хотите "очистить". Запрос вернет строку с исходным кодом на страницу. Оттуда вы будете использовать регулярное выражение для анализа любых данных, которые вы хотите получить из исходного кода. В общем, как вы собираетесь это делать.