Как "сканировать" веб-сайт (или страницу) для информации и вводить его в мою программу?

Ну, я в основном пытаюсь понять, как извлекать информацию с веб-страницы и переносить ее в мою программу (на 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" для дальнейшей инверсии.

Ответ 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 на любую страницу, которую вы хотите "очистить". Запрос вернет строку с исходным кодом на страницу. Оттуда вы будете использовать регулярное выражение для анализа любых данных, которые вы хотите получить из исходного кода. В общем, как вы собираетесь это делать.