Почему wget загружает index.html только для некоторых веб-сайтов?

Я пытаюсь использовать команду wget:

wget -p http://www.example.com 

чтобы получить все файлы на главной странице. Для некоторых веб-сайтов это работает, но в большинстве случаев загружается только index.html. Я пробовал команду wget -r, но она не работает. Кто-нибудь знает, как получить все файлы на странице или просто дать мне список файлов и соответствующие URL-адреса на странице?


person Jay H    schedule 20.06.2012    source источник
comment
Чем это отличается от вашего предыдущий вопрос? Если это та же проблема, отредактируйте свой старый вопрос, чтобы прояснить его.   -  person Emil Vikström    schedule 20.06.2012
comment


Ответы (8)


Wget также может загрузить весь веб-сайт. Но поскольку это может создать большую нагрузку на сервер, wget будет подчиняться файлу robots.txt.

 wget -r -p http://www.example.com

Параметр -p сообщает wget, что нужно включить все файлы, включая изображения. Это будет означать, что все файлы HTML будут выглядеть так, как должны.

Так что, если вы не хотите, чтобы wget подчинялся файлу robots.txt? Вы можете просто добавить -e robots = off к команде следующим образом:

 wget -r -p -e robots=off http://www.example.com

Поскольку многие сайты не позволяют загружать сайт целиком, они проверяют подлинность вашего браузера. Чтобы обойти это, используйте -U mozilla, как я объяснил выше.

 wget -r -p -e robots=off -U mozilla http://www.example.com

Многим владельцам веб-сайтов не понравится тот факт, что вы загружаете их сайт целиком. Если сервер видит, что вы загружаете большое количество файлов, он может автоматически добавить вас в черный список. Чтобы решить эту проблему, подождите несколько секунд после каждой загрузки. Чтобы сделать это с помощью wget, нужно включить --wait = X (где X - количество секунд).

вы также можете использовать параметр: --random-wait, чтобы позволить wget выбрать случайное количество секунд для ожидания. Чтобы включить это в команду:

wget --random-wait -r -p -e robots=off -U mozilla http://www.example.com
person Ritesh Chandora    schedule 20.06.2012
comment
Спасибо за Ваш ответ. Я попробовал 3 способа, которые вы упомянули для некоторых распространенных URL-адресов (например, amazon.com), но я получил только index.html. Есть ли у вас другие предложения? - person Jay H; 20.06.2012
comment
то же самое. Только index.html - person BigSack; 24.03.2013
comment
@JayH постарайтесь не использовать адрес, который будет перенаправлен. Т.е. если вы используете http://amazon.com, это не сработает, потому что вы будете перенаправлены на www.amazon.com, но если вы воспользуетесь http://www.amazon.com, он начнет загружать весь сайт. Возможность не следить за файлом роботов - это не очень вежливо, поэтому оно не будет работать так хорошо, как вы можете себе представить. - person Stefano Falsetto; 25.08.2014
comment
Я ненавижу то, что самый ценный ответ находится внизу сайта - person user4757174; 14.04.2017
comment
В дополнение к --random-wait также может использоваться параметр -w X, где X - время в секундах, и он используется в качестве базового значения для вычисления случайного времени ожидания. - person S.I.; 03.11.2017

Во-первых, чтобы прояснить вопрос, цель состоит в том, чтобы загрузить index.html плюс все необходимые части этой страницы (изображения и т. Д.). Параметр -p эквивалентен --page-requisites.

Причина, по которой реквизиты страницы не всегда загружаются, заключается в том, что они часто размещаются в домене, отличном от домена исходной страницы (например, CDN). По умолчанию wget отказывается посещать другие хосты, поэтому вам необходимо включите охват хоста с помощью параметра --span-hosts.

wget --page-requisites --span-hosts 'http://www.amazon.com/'

Если вам нужно иметь возможность загружать index.html и загружать все реквизиты страницы из локальной версии, вам нужно добавить параметр --convert-links, чтобы URL-адреса в атрибутах img src (например) были переписаны на относительные URL-адреса, указывающие на локальные версии.

При желании вы также можете сохранить все файлы в одном каталоге «хоста», добавив параметр --no-host-directories, или сохранить все файлы в одном плоском каталоге, добавив параметр --no-directories.

Использование --no-directories приведет к загрузке большого количества файлов в текущий каталог, поэтому вы, вероятно, захотите указать имя папки для выходных файлов, используя --directory-prefix.

wget --page-requisites --span-hosts --convert-links --no-directories --directory-prefix=output 'http://www.amazon.com/'
person Alf Eaton    schedule 22.08.2014
comment
Спасибо за ценный ответ. Не могли бы вы добавить дополнительную информацию, чтобы сделать ее более общей, прежде чем я смогу наградить вас наградой. Как, например, http://indiabix.com/civil-engineering/questions-and-answers/ по этой ссылке, я хочу, чтобы wget посетил каждую категорию / главу и загрузил все изображения с каждой страницы в каждом разделе (на левой боковой панели). Обратите внимание, что под изображениями я подразумеваю все изображения, включая изображения математических формул, участвующих в вопросах. Проблема в том, что загрузка останавливается после загрузки index.html. Рабочий пример для этого случая был бы отличным !!! - person Insane Coder; 23.08.2014
comment
@InsaneCoder. Возможно, вы захотите создать для этого отдельный вопрос и показать, что вы пробовали, поскольку рекурсивная выборка - это совершенно другой набор проблем, и (насколько я понимаю) это не то, о чем спрашивал исходный вопрос. - person Alf Eaton; 26.08.2014
comment
@InsaneCoder. Добавление параметра --mirror является наиболее простым и может быть достаточным для ваших нужд. - person Alf Eaton; 26.08.2014
comment
Будьте осторожны, используйте --span-hosts, добавьте -D<domain-list>, чтобы ограничить охват определенными доменами. - person Evan Hu; 15.09.2016
comment
@EvanHu Добавление белого списка доменов здесь не поможет, так как wget должен иметь возможность получать реквизиты страницы, где бы они ни находились. - person Alf Eaton; 20.09.2016
comment
@AlfEaton спасибо за вашу заботу. Можете ли вы попробовать wget -rkEpHN -e robots=off -U mozilla http://www.yinwang.org/ и wget -rkEpHN -Dyinwang.org -e robots=off -U mozilla http://www.yinwang.org/ и проверить результаты? - person Evan Hu; 22.09.2016
comment
@EvanHu Эти команды используют флаг -r (рекурсивный), поэтому не имеют отношения к этому вопросу / ответу. - person Alf Eaton; 26.09.2016
comment
--span-hosts вместе с --domain= спасли меня. У меня был веб-сайт с изображениями на поддомене ststic, поэтому wget не мог их получить - person vladkras; 02.11.2016

Ссылка, которую вы предоставили, является домашней страницей или /index.html, поэтому ясно, что вы получаете только страницу index.html. Для фактической загрузки, например, для файла "test.zip", вам нужно добавить точное имя файла в конце. Например, используйте следующую ссылку для загрузки файла test.zip:

wget -p domainname.com/test.zip

Загрузить полный веб-сайт с помощью wget --mirror

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

wget --mirror -p --convert-links -P ./LOCAL-DIR http://www.example.com

  • –Mirror: включить параметры, подходящие для зеркального отображения.

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

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

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

Загружать только определенные типы файлов с помощью wget -r -A

Вы можете использовать это в следующих ситуациях:

  • Загрузите все изображения с веб-сайта,

  • Скачать все видео с веб-сайта,

  • Загрузите все файлы PDF с веб-сайта

wget -r -A.pdf http://example.com/test.pdf

person Athul AK    schedule 21.08.2014
comment
Спасибо. Вариант --mirror был тем, что наконец заставило меня работать. - person vergenzt; 18.07.2015

Другая проблема может заключаться в том, что зеркалируемый вами сайт использует ссылки без www. Итак, если вы укажете

wget -p -r http://www.example.com

он не будет загружать никакие связанные (внутренние) страницы, потому что они из «другого» домена. Если это так, используйте

wget -p -r http://example.com

вместо этого (без www).

person jor    schedule 30.08.2015
comment
Правильное наблюдение. Это основная причина моей проблемы. - person Evan Hu; 15.09.2016

У меня была такая же проблема с загрузкой файлов модели CFSv2. Я решил это, смешав приведенные выше ответы, но добавив параметр --no-check-certificate

wget -nH --cut-dirs=2 -p -e robots=off --random-wait -c -r -l 1 -A "flxf*.grb2" -U Mozilla --no-check-certificate https://nomads.ncdc.noaa.gov/modeldata/cfsv2_forecast_6-hourly_9mon_flxf/2018/201801/20180101/2018010100/

Здесь краткое объяснение каждого используемого параметра, для дальнейшего объяснения перейдите к GNU wget 1.2 Руководство

  • -nH эквивалент --no-host-directories: отключить создание каталогов с префиксом хоста. В этом случае избегайте создания каталога ./https://nomads.ncdc.noaa.gov/

  • --cut-dirs=<number>: игнорировать компоненты каталога. В этом случае избегайте создания каталогов ./modeldata/cfsv2_forecast_6-hourly_9mon_flxf/

  • -p эквивалент --page-requisites: этот параметр заставляет Wget загружать все файлы, необходимые для правильного отображения данной HTML-страницы. Сюда входят такие вещи, как встроенные изображения, звуки и таблицы стилей, на которые есть ссылки.

  • -e robots=off: не загружайте файл robots.txt

  • -random-wait: заставляет время между запросами варьироваться от 0,5 до 1,5 * секунд, где было указано с использованием параметра --wait.

  • -c эквивалент --continue: продолжить получение частично загруженного файла.

  • -r эквивалент --recursive: включить рекурсивное извлечение. Максимальная глубина по умолчанию - 5.

  • -l <depth> эквивалент --level <depth>: укажите максимальный уровень глубины рекурсии

  • -A <acclist> эквивалент --accept <acclist>: укажите список суффиксов или шаблонов имен, разделенных запятыми, которые необходимо принять.

  • -U <agent-string> эквивалент --user-agent=<agent-string>: протокол HTTP позволяет клиентам идентифицировать себя с помощью поля заголовка User-Agent. Это позволяет различать программное обеспечение WWW, обычно для статистических целей или для отслеживания нарушений протокола. Wget обычно идентифицируется как «Wget / version», причем версия является текущим номером версии Wget.

  • --no-check-certificate: Не сверяйте сертификат сервера с доступными центрами сертификации.

person cmcuervol    schedule 21.03.2019
comment
Это сделали -e роботы = off! - person Shawn; 16.05.2020

Я знаю, что эта ветка старая, но попробуйте то, что упоминает Ритеш, с:

--нет печенья

У меня это сработало!

person Joshua    schedule 10.03.2014

Если вы ищете index.html в руководстве по wget, < / strong> вы можете найти параметр --default-page=name, который по умолчанию равен index.html. Например, вы можете изменить на index.php.

--default-page=index.php
person adrianTNT    schedule 17.11.2013

Если вы получаете только index.html и этот файл выглядит так, как будто он содержит только двоичные данные (то есть не читаемый текст, только управляющие символы), то сайт, вероятно, отправляет данные с использованием сжатия gzip.

Вы можете подтвердить это, запустив cat index.html | gunzip, чтобы увидеть, выводит ли он читаемый HTML.

В этом случае рекурсивная функция wget (-r) работать не будет. Есть патч для wget работы со сжатыми данными gzip, но, похоже, этого еще нет в стандартной версии.

person Silveri    schedule 01.09.2017