Як змусити 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.


Яка 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, щоб просто скинути те, що вас цікавить.


Це також не працює, наприклад, 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 .


2
Це не працюватиме з надісланим JavaScript контентом. Для цього вам потрібно використовувати phantomjs, на що відповів lemonsqueeze.
Маттіас

1
Цей cmd також буде проходити через всі додаткові URL-адреси, які завантажуватимуть ресурси, не потрібні для візуалізації даної веб-сторінки.
1rq3fea324верто

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варіант (використовуйте "/" для пошуку під час читання чоловічої сторінки).


2

Якщо відповідь сервера відрізняється залежно від запитуючого джерела, це здебільшого через змінну HTTP_USER_AGENT (просто текстову рядок), яка надається запитом від джерела запиту, інформуючи сервер про технологію.


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

  2. Відповідно до посібника WGET цей параметр повинен виконати цю роботу --user-agent=AGENT.


Якщо це не допомагає, тобто обробка JavaScript може знадобитися для отримання тієї самої сторінки, що і браузер, або, можливо, відповідний запит з параметрами GET, щоб сервер підготував відповідь, що не вимагає JavaScript для заповнення сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.