Как получить WGET для загрузки точно такой же HTML-страницы, как браузер

34

С помощью веб-браузера (IE или Chrome) я могу сохранить веб-страницу (.html) с помощью Ctl-S, проверить ее в любом текстовом редакторе и просмотреть данные в табличном формате. Один из тех номеров, которые я хочу извлечь, но для многих, многих веб-страниц, слишком много, чтобы сделать вручную. Поэтому я хотел бы использовать WGET, чтобы получать эти веб-страницы одну за другой, и написать другую программу для анализа .html и получения нужного мне числа. Но файл .html, сохраненный WGET при использовании того же URL-адреса, что и браузер, не содержит таблицу данных. Почему бы нет? Как будто сервер обнаруживает, что запрос поступает от WGET, а не от веб-браузера, и предоставляет скелетную веб-страницу без таблицы данных. Как я могу получить ту же самую веб-страницу с WGET? - Спасибо!

БОЛЬШЕ ИНФОРМАЦИИ:

Пример URL я пытаюсь принести это: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US где строку ICENX является символом тикера взаимного фонда , который я буду менять на любой из множества различных символов тикера. Это загружает таблицу данных при просмотре в браузере, но таблица данных отсутствует, если извлекается с помощью WGET.

user239598
источник
Какой это URL?
Брайам
2
Скорее всего, исходный HTML-код заполняется с использованием методов AJAX фрагментом javascript, который загружает и заполняет таблицу. В этом случае вам, вероятно, повезет больше, когда вы получите вызов этого сценария. Как спрашивает Брайам, если вы предоставите URL, мы сможем помочь вам разобраться в этом.
roadmr
1
Дополнительная информация: в браузере, когда вы отображаете исходный код, вы не видите исходный HTML (такой же, как у wget), но HTML обновляется с помощью javascript / ajax. Современные браузеры показывают такой сгенерированный источник вместо простого HTML.
Врата Блазек

Ответы:

39

Как отметил roadmr , таблица на этой странице генерируется с помощью javascript. wget не поддерживает javascript, он просто выгружает страницу, полученную с сервера (т.е. до запуска любого кода javascript), поэтому таблица отсутствует.

Вам нужен безголовый браузер, который поддерживает javascript, например, phantomjs :

$ phantomjs save_page.js http://example.com > page.html

с помощью save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Тогда, если вы просто хотите извлечь какой-либо текст, проще всего сделать страницу с помощью w3m:

$ w3m -dump page.html

и / или измените скрипт phantomjs так, чтобы он просто сбрасывал то, что вам интересно.

lemonsqueeze
источник
Это также не работает, например, cotrino.com/lifespan
mrgloom
JS сгенерированные ссылки не будут работать с этим
QkiZ
1
2018: проект PhantomJS приостановлен до дальнейшего уведомления :(
1rq3fea324wre
Это решение предназначено только для загрузки страниц с указанных URL-адресов. Как вы связываете механизм сканирования сайта wget? Кроме того, как будет выглядеть сценарий с хромом без головы?
Фил
10

Вы можете скачать полный сайт, используя wget --mirror

Пример:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

Приведенная выше командная строка, которую вы хотите выполнить, когда вы хотите загрузить полный веб-сайт и сделать его доступным для локального просмотра.

Опции:

  • --mirror включает опции, подходящие для зеркалирования.

  • -p загружает все файлы, необходимые для правильного отображения данной HTML-страницы.

  • --convert-links после загрузки преобразуйте ссылки в документе для локального просмотра.

  • -P ./LOCAL-DIR сохраняет все файлы и каталоги в указанный каталог.

Подробнее о параметрах Wget Подробнее в этой статье: Обзор обо всех командах wget с примерами или посмотрите справочную страницу Wget .

GowriShankar
источник
2
Это не будет работать с содержимым, отображаемым в JavaScript. Для этого вам нужно будет использовать фантомы в ответ на lemonsqueeze.
Маттиас
1
Этот cmd будет также проходить по всем под-URLам, которые будут загружать ресурсы, которые не нужны для отображения данной веб-страницы.
1rq3fea324wre
3

Вместо того --recursive, чтобы просто «пауковать» каждую ссылку в вашем URL, используйте --page-requisites. Должен вести себя точно так же, как параметры, которые вы описываете в графических браузерах.

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

Для получения дополнительной информации, man wgetнайдите и найдите эту --page-requisitesопцию (используйте «/» для поиска во время чтения страницы руководства ).

roadmr
источник
2

Если ответ сервера различается в зависимости от запрашиваемого источника, это происходит главным образом из-за переменной HTTP_USER_AGENT (просто текстовая строка), которой предоставляется запрос из запрашивающего источника, информирующего сервер о технологии.


  1. Вы можете проверить ваш агент браузера здесь -> http://whatsmyuseragent.com

  2. Согласно руководству WGET этот параметр должен выполнять свою работу --user-agent=AGENT.


Если это не помогает, то есть обработка JavaScript может потребоваться для получения той же страницы, что и браузер, или, возможно, соответствующий запрос с параметрами GET, чтобы сервер подготовил ответ, который не требует JavaScript для заполнения страницы.

Esamo
источник