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

Ну, я в значительной степени пытаюсь выяснить, как вытянуть информацию от веб-страницы и принести ее в мою программу (в Java).

Например, если бы я знаю точную страницу, я хочу информацию от ради простоты страница объекта Best Buy, как я получил бы соответствующую информацию, в которой я нуждаюсь прочь той страницы? Как заголовок, цена, описание?

Что это обработало бы даже быть названным? Я понятия не имею, должны были даже начать исследовать это.

Править: Хорошо, я запускаю тест для 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 палатой общин

51
задан Ram kiran 27 November 2012 в 18:31
поделиться

7 ответов

Используйте парсер HTML, например Jsoup. Я отдаю ему предпочтение перед другими HTML парсерами, доступными в Java, поскольку он поддерживает jQuery, как CSS селекторы. Кроме того, его класс, представляющий список узлов, Elements, реализует Iterable , так что вы можете перебирать их в расширенном цикле for (поэтому нет необходимости возиться с многословными Node и NodeList, как в обычном Java DOM-парсере).

Вот базовый пример запуска (просто поместите последний Jsoup 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());
        }
    }

}

Как вы уже догадались, это печатает ваш собственный вопрос и имена всех отвечающих.

93
ответ дан 7 November 2019 в 09:56
поделиться

Это называется screen scraping, в Википедии есть статья о более специфическом web scraping. Это может быть серьезной проблемой, потому что там есть уродливый, беспорядочный, сломанный, если не для браузера, HTML, так что удачи.

10
ответ дан 7 November 2019 в 09:56
поделиться

Я бы использовал JTidy - он похож на JSoup, но я плохо знаю JSoup. JTidy обрабатывает сломанный HTML и возвращает документ w3c, поэтому вы можете использовать его в качестве источника XSLT для извлечения действительно интересующего вас контента. Если вы не знаете XSLT, то вы можете также использовать JSoup, как документ Модель приятнее работать, чем w3c.

РЕДАКТИРОВАТЬ: Быстрый просмотр веб-сайта JSoup показывает, что JSoup действительно может быть лучшим выбором. Кажется, он поддерживает селекторы CSS для извлечения материалов из документа. С этим может быть намного проще работать, чем с XSLT.

6
ответ дан 7 November 2019 в 09:56
поделиться

Вы можете использовать парсер html (много полезных ссылок здесь: java html parser).

Этот процесс называется "захват содержимого сайта". Для дальнейшей инверсии выполните поиск 'grab website content java'.

4
ответ дан 7 November 2019 в 09:56
поделиться

Вы, вероятно, захотите посмотреть на HTML, чтобы увидеть, можете ли вы найти строки, которые уникальны и находятся рядом с вашим текстом, затем вы можете использовать смещения строк/символов, чтобы добраться до данных.

Может быть неудобно в Java, если нет классов XML, подобных тем, что есть в System.XML.Linq в C#.

2
ответ дан 7 November 2019 в 09:56
поделиться

Посмотрите на библиотеку cURL. Я никогда не использовал ее в Java, но уверен, что для нее должны быть привязки. По сути, вы посылаете cURL-запрос на страницу, которую хотите "соскрести". Запрос вернет строку с исходным кодом страницы. Далее вы будете использовать regex для анализа любых данных, которые вы хотите получить из исходного кода. Вот, в общем, как вы собираетесь это делать.

-1
ответ дан 7 November 2019 в 09:56
поделиться

Решение JSoup отличное, но если вам нужно извлечь что-то действительно простое, может быть проще использовать регулярное выражение или String.indexOf

As другие уже упоминали, что процесс называется очисткой

2
ответ дан 7 November 2019 в 09:56
поделиться
Другие вопросы по тегам:

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