Очистка веб-страниц с помощью java и загрузка видео

Я пытаюсь очистить этот 9gag связь

Я попытался использовать JSoup, чтобы получить этот HTML ярлык для взятия исходной ссылки и прямой загрузки видео.

Я пробовал с этим кодом

    public static void main(String[] args) throws IOException {
        Response response= Jsoup.connect("https://9gag.com/gag/a2ZG6Yd")
                   .ignoreContentType(true)
                   .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")  
                   .referrer("https://www.facebook.com/")
                   .timeout(12000) 
                   .followRedirects(true)
                   .execute();

        Document doc = response.parse();
        System.out.println(doc.getElementsByTag("video"));
    }

но я ничего не получаю

Я попробовал тогда это

    public static void main(String[] args) throws IOException {
        Response response= Jsoup.connect("https://9gag.com/gag/a2ZG6Yd")
                   .ignoreContentType(true)
                   .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")  
                   .referrer("https://www.facebook.com/")
                   .timeout(12000) 
                   .followRedirects(true)
                   .execute();

        Document doc = response.parse();
        System.out.println(doc.getAllElements());
    }

и я заметил, что в HTML нет искомого тега, как будто страница грузится динамически и тег "видео" еще не загружен

Что я мог сделать? Всем спасибо ?

Вам нужно будет сделать все, что сделал бы браузер, чтобы инициировать отправку тега видео. Непростая задача, так как это, вероятно, Javascript.

Steve Smith 26.04.2019 15:56

Разве я не могу просто сказать JSoup запускать все события javascript при посадке на страницу?

tassi4224 26.04.2019 16:15

Возможно, но знаете ли вы, что запускает отправку тега? Это может быть прокрутка страницы вниз, нажатие кнопки или что-то еще.

Steve Smith 26.04.2019 16:18

Теоретически, просто приземлившись на странице, я могу увидеть тег, не прокручивая и не нажимая ничего.

tassi4224 26.04.2019 16:41

Это вполне может быть загрузка тега как часть запроса ajax после загрузки главной страницы. Я бы использовал инструменты веб-разработчика, чтобы узнать, какой запрос получает тег.

Steve Smith 26.04.2019 16:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
1 026
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Давайте изменим подход. Вы уже знаете, что мы ищем URL типа https://img-9gag-fun.9cache.com/photo/a2ZG6Yd_460svvp9.webm (Чтобы получить URL-адрес видео, вы также можете щелкнуть его правой кнопкой мыши в Chrome и выбрать «Копировать адрес видео»).

Если вы ищете источник страницы, вы найдете a2ZG6Yd_460svvp9.webm, но он хранится в JSON внутри <script>.

Это плохая новость для Jsoup, потому что его нельзя разобрать, но мы можем использовать простое регулярное выражение, чтобы получить эту ссылку. URL-адрес экранирован, поэтому нам нужно удалить обратную косую черту. Затем вы можете использовать Jsoup для загрузки файла.

    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect("https://9gag.com/gag/a2ZG6Yd").ignoreContentType(true)
                .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                .referrer("https://www.facebook.com/").timeout(12000).followRedirects(true).get();

        String html = doc.toString();

        Pattern p = Pattern.compile("\"vp9Url\":\"([^\"]+?)\"");
        Matcher m = p.matcher(html);
        if (m.find()) {
            String escpaedURL = m.group(1);
            String correctUrl = escpaedURL.replaceAll("\\\\", "");
            System.out.println(correctUrl);
            downloadFile(correctUrl);
        }
    }

    private static void downloadFile(String url) throws IOException {
        FileOutputStream out = (new FileOutputStream(new File("C:\\file.webm")));
        out.write(Jsoup.connect(url).ignoreContentType(true).execute().bodyAsBytes());
        out.close();
    }

Также обратите внимание, что vp9Url там не один, так что, возможно, больше подойдет другой, например h265Url или webpUrl.

Если вам понравился ответ, не забудьте отметьте это как принятое.

Krystian G 27.04.2019 19:50

Другие вопросы по теме