Проблемы с подключением Java URL к целым числам

#java #url

#java #url

Вопрос:

Я пытался получить информацию с веб-страницы, в частности с этого сайта: http://www.ncbi.nlm.nih.gov/pubmed?term=»pulmonary disease, chronic obstructive»[Mesh] (среди других подобных). Для этого я использую пакеты URL и URLConnection. Я пытаюсь получить определенное число с веб-страницы — на этой странице мне нужно общее количество статей (16428).

В верхней части страницы написано следующее: «Результаты: от 1 до 20 из 16428», и когда я смотрю на источник страницы вручную, я могу найти это. Однако, когда я пытаюсь использовать соединение Java для получения этого номера из источника страницы, по какой-то причине полученное число равно «863399» вместо «16428».

Код:

     URL connection = new URL("http://www.ncbi.nlm.nih.gov/pubmed?term="pulmonary disease, chronic obstructive"[Mesh]");
    URLConnection yc = connection.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
    String html = "";
    String inputLine;
    while ((inputLine = in.readLine()) != null) html  = inputLine;
    in.close();


    int startMarker = html.indexOf("ncbi_resultcount");
    int endMarker = html.indexOf("ncbi_op");

    System.out.println(html.substring(startMarker, endMarker));
 

Когда я запускаю этот код, я получаю:

ncbi_resultcount» content=»863399″ />

вместо:

ncbi_resultcount» content=»16428″ />

Кто-нибудь знает, почему это / как я могу это исправить?

Спасибо!

Комментарии:

1. что такое nbci_resultcount? Когда я просматриваю источник, я нахожу: <h2 class=»result_count»> Результаты: от 1 до 20 из 16433</h2>. Я думаю, что ваш indexOf неверен, может быть, стоит рассмотреть возможность использования регулярного выражения?

2. Делает ли это то же самое, если вы настроите пользовательский агент на что-то вроде реального браузера? Есть ли какие-либо другие различия в возвращаемом HTML-файле, кроме результатов поиска, которые могли бы дать ключ к пониманию того, почему поиск возвращает разные результаты?

3. @Kevin OP говорит, что возвращаемый HTML отличается в коде Java и браузере.

4. Я не покупаю это, я просто использовал curl и получил то же самое, что и браузер.

5. Когда я говорю yc.setRequestProperty(«User-Agent», «Mozilla») Я все еще получаю вывод: ncbi_resultcount» content=»863492″ /><meta name=»

Ответ №1:

Я не могу воспроизвести вашу проблему и понятия не имею, почему это происходит. Возможно, он отслеживает конкретные версии пользовательского агента Java. Затем вам нужно будет попытаться установить User-Agent заголовок на что-то другое, чтобы притвориться «настоящим» веб-браузером.

 yc.setRequestProperty("User-Agent", "Mozilla");
 

Не имея отношения к конкретной проблеме, я бы предложил использовать для этой работы настоящий синтаксический анализатор HTML, такой как Jsoup. Тогда это так просто, как:

 Document document = Jsoup.connect("http://www.ncbi.nlm.nih.gov/pubmed?term="pulmonary disease, chronic obstructive"[Mesh]").get();
Element nbci_resultcount = document.select("meta[name=ncbi_resultcount]").first();
System.out.println(nbci_resultcount.attr("content")); // 16433
 

Комментарии:

1. Я поддерживаю это. Вероятно, сервер возвращает немного другой документ, когда вы извлекаете его через URLConnection вместо браузера. Пусть ваша Java-программа сохранит документ в файл, затем сохраните другую копию в вашем браузере и сравните их.

2. Я пробовал как в Java 1.6.0_23, так и в 1.7.0. Тот же результат с 16433. Проблема OP для меня невоспроизводима.

3. Когда я использую код Jsoup, результат, который я получаю, по-прежнему равен 863492, а не 16433

4. Что, если вы измените заголовок user agent? Заменить .get() на .userAgent("Mozilla").get() . Вы на 100% уверены, что запрашиваете тот же URL, который вы указали в своем вопросе? Для отслеживания HTTP-трафика вы можете найти fiddler2.com полезный.

5. Все еще получаю неправильный результат. Я почти уверен, что использую тот же URL-адрес, поскольку я скопировал и вставил URL-адрес из своего кода в вопрос здесь. Это довольно неприятно…