HTML-содержимое отличается от Google "Просмотр источника страницы" - PullRequest
0 голосов
/ 23 сентября 2019

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

Я пытаюсь получить содержимое HTML, скажем, https://www.kayak.fr/flights/TLS-ATH/2019-10-04/2019-10-07?sort=price_a,, когда я нажимаю "Просмотреть исходный код страницы" с помощью Google Chrome, я получаю цены и т. Д. (Что мне нужно), но я не могу получить к ним доступ с помощьюмой код Java ..

Нужно ли мне искать агента пользователя моего Google Chrome?Я нашел эту страницу , но я получаю тот же результат, что и раньше, используя java ..

Есть идеи?

Вот мой код:

try{
    URL url = new URL("https://www.kayak.fr/flights/TLS-ATH/2019-10-04/2019-10-07?sort=price_a");
    URLConnection con = url.openConnection();
    con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
    String line;
    while((line = bufferedReader.readLine()) != null){
        System.out.println(line);
    }
    bufferedReader.close();
}catch(IOException e){
    e.printStackTrace();
}

setRequestProperty действительно случайный в этом коде, потому что я все еще тестирую.

1 Ответ

0 голосов
/ 24 сентября 2019

Я написал довольно большую HTML-библиотеку для поиска и поиска.Есть много сайтов, которые делают трюки, о которых я не знаю точно после двух лет.Я перебираю иностранные новостные сайты и перевожу их.Например, Google переводчик точно знает, когда веб-браузер Google Chrome отправляет запрос, а когда мой программный пакет Java отправляет запрос.

Я несколько раз менял пользовательский агент, но покаЭто ряд веб-серверов, которые не всегда предоставляют тот же HTML-ответ Java-программе, что и браузер.Я подозреваю, что у веб-браузеров могут быть неопубликованные рукопожатия, но я могу ошибаться.Говорят, что код Google Chrome Browser - это проект с «открытым исходным кодом», но я пока не пытался его прочитать.Может быть, вы могли бы попробовать!:)

Я знаю, однако, что кнопка «Просмотреть исходный код» (внутри графического интерфейса браузера) довольно часто отображает другой HTML-код для пользователя Google Chrome, чем для Java-программы - даже когдаПараметр «АГЕНТ-ПОЛЬЗОВАТЕЛЬ» настроен на некоторые варианты «Google Chrome».

http://developer.torello.directory/JavaHTML/index.html

ТАКЖЕ: Помните!Подавляющее большинство веб-сайтов используют, по крайней мере, НЕКОТОРЫЕ JAVASCRIPT.

Когда используется JavaScript - если выполняется какой-либо AJAX / JSON (обратный вызов на сервер) - (надеюсь, это очевидно!), ТОлюбой выполняемый Java-скрипт, если он изменяет HTML в веб-браузере, эти изменения не будут отражены или отображены в простой или «наивной» версии «HTML Scrape»

Inкод, который вы разместили, например, любой Java-скрипт, который находится на фактической странице, которую вы видите в вашем браузере, вообще не выполняется.Язык Java не включает ни в одну из своих «Стандартных библиотек» файл JAR для выполнения Java-Script.Я читал, что кое-что из этого возможно с помощью Selenium Web Driver, но я никогда не использовал Selenium.

В качестве отступления я написал это быстрое исследование, используя мою библиотеку JAR по приведенной выше ссылке .... Дадействительно, сохраненный очищенный HTML-код отличается от HTML-кода, который я сохранил с помощью «Просмотреть исходный код» ... Да, две версии отличаются.Строка кода, которая устанавливает «пользовательский агент»:

public static String USER_AGENT = "Chrome / 61.0.3163.100";

Вот мой код HTML Scrape:

import Torello.HTML.*;
import Torello.HTML.NodeSearch.*;
import Torello.Java.*;

import java.io.*;
import java.net.*;
import java.util.*;

public class SO 
{
    public static void main(String[] argv) throws IOException
    {
        URL url = new URL("https://www.kayak.fr/flights/TLS-ATH/2019-10-04/2019-10-07?sort=price_a");
        Vector<HTMLNode> page = HTMLPage.getPageTokens(url, false);
        StringBuffer sb = new StringBuffer();
        for (HTMLNode n : page) sb.append(n.str);
        FileRW.writeFile(sb, "out.html");
    }
}

Файл: SO.java

Просмотр исходного кода страницы: VPS.html

Scraped (используя вышеупомянутый Java-класс) HTML: out.html

Где размер файла (количество текста, возвращаемого вариантом / средством «загрузки через Интернет»):

Просмотр страницы Кнопка Chrome: VPS.html 2,51 МБ text / html

Очистка URL-адреса Java: out.html 91,46 КБ text / html (гораздо меньше возвращаемых данных!)

Итак, использование двух разных способов или средств извлечения данных HTML с этого конкретного веб-серверапохоже, возвращают два разных набора HTML ...

СНОВА, ПРИМЕЧАНИЕ: на вашей странице есть тонна Java-Script, и (опять же, надеюсь, это "очевидно")Ни один из этого JavaScript не является exeвырезан.И ... ДА ... Это java-скрипт AJAX, что означает, что он выполняет вызовы и отправляет запросы на сервер для получения дополнительных данных.

ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ: Если вы можете выбрать через Java-ScriptAJAX звонит, вы можете отправлять запросы непосредственно на этот сайт. ОДНАКО, если это действительно «Веб-сайт рейса авиакомпании» - я мог бы отметить, что это тип скрапа, который я на самом деле не делаю сам. Я не связываюсь сданные рейса авиакомпании вообще.Я просто перевожу иностранные новостные сайты.(кажется «рискованным»)

...