Я пытаюсь очистить этот 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 нет искомого тега, как будто страница грузится динамически и тег "видео" еще не загружен
Что я мог сделать? Всем спасибо ?
Разве я не могу просто сказать JSoup запускать все события javascript при посадке на страницу?
Возможно, но знаете ли вы, что запускает отправку тега? Это может быть прокрутка страницы вниз, нажатие кнопки или что-то еще.
Теоретически, просто приземлившись на странице, я могу увидеть тег, не прокручивая и не нажимая ничего.
Это вполне может быть загрузка тега как часть запроса ajax после загрузки главной страницы. Я бы использовал инструменты веб-разработчика, чтобы узнать, какой запрос получает тег.




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