#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-адрес из своего кода в вопрос здесь. Это довольно неприятно…