LINUX.ORG.RU

wget: как скачать страничку с ресурсами?

 


1

4

Задача, вроде бы, примитивная — скачать страницу и все картинки (и прочие файлы), на которые страница ссылается. Но не выкачивая страницы, на которые она ссылается!

И вот тут — облом. Если тупо скачивать с --page-requisites, то страница скачивается в отличном виде, но, понятно, не качаются, например, большие картинки, превьюшки которых стоят на странице.

Если добавляем -r -l1, то качаем всё, на что страница ссылается, но это ещё и десятки, иногда сотни .html первого уровня и... внезапно! тоже с --page-requisites — т.е. десятки и сотни картинок со своими ресурсами!

Если качать без --page-requisites, то наша основная страница качается не целиком, утягиваются не все ресурсы.

Если добавлять --accept '*.jpg' или --reject '*.html', то, опять внезапно, не качается и сама страница, которую мы хотим скачать, так как она — .html

Блин, вот как задачу решить? :)

★★★★★
Ответ на: комментарий от ArcFi

Написать на коленке рекурсивный парсер с фильтром?

Ну, да, помним. Крутой современный опенсорс-браузер на Бейсике :)

10 PRINT "Это крутой браузер на Бейсике"
20 REM Остальной функционал можно дописать самому, это же OpenSource!


:)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от nihil

httrack давно пробовал, инструмент мощный, но что-то мне не подходило... Надо освежить в памяти. И, может, лучше стал :)

Про pavuk не слышал. Посмотрю.

KRoN73 ★★★★★
() автор топика

Если добавлять --accept '*.jpg' или --reject '*.html', то, опять внезапно, не качается и сама страница, которую мы хотим скачать, так как она — .html

Сколько нужно php-программистов, чтобы вызвать wget два раза или написать тривиальную регулярочку*

aedeph_ ★★
()

Без парсера css и поддержки js это малореально.

Правильно отобразить страницу может только полноценный браузер. А его можно попросить ходить через прокси, который может сохранить все, что попросил браузер.

FF + Xvfb?

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 2)
Ответ на: комментарий от slon

посмотрел?

Ещё не собрался. Но уже всё понял :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от vel

Без парсера css и поддержки js это малореально.

Не важно. Дл 99% случаев (и мне этого хватит) достаточно url в css и img/href в html. wget это умеет делать при --page-requisites. Проблема тут именно в лимитировании выкачивания.

...

Чую я, придётся мириться с --page-requisites для всех связанных страниц первого уровня :-/

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Мне довелось писать парсер для сайта. У нас заказчик пилил шаблончики на вордпрессе. И каждый раз давал одну и ту же ссылку но с новой шкуркой. Ему — только переключить кнопочку в админке для смены шкурки. Нам — копировать все наново и вручную разбирать и переносить шкурку на другой движок. Вот я и написал парсер за неделю, который сократил время натягивания шкурки и сдачи сайта до 2-3 дней, Он собирал указанные страницы с их ресурсами (картинки, стили, скрипты), форматировал отступы в коде, комментировал с какого урл он стырил этот кусок, ну и все такое. Там были проблемы с бекграундами в ксс и путями к картинкам в нестандартных атрибутах, конфликтами скриптов изза порядка их подключения. Но это все было уже не так много и для ручной правки. Извини, я бы поделился, но NDA намекает, что низя. Я просто хочу сказать что это в целом не сложно и не долго.

deep-purple ★★★★★
()

И вот тут — облом. Если тупо скачивать с --page-requisites, то страница скачивается в отличном виде, но, понятно, не качаются, например, большие картинки, превьюшки которых стоят на странице.

Ну а как ты себе это представляешь? Wget запускает интерпретаторы javascript & css, потом запускает встроенный модуль эмуляции пользователя и пытается понять куда нужно ткнуть чтобы получить ссылку на большую версию картинки? И есть ли она вообще.
:)

urxvt ★★★★★
()
Ответ на: комментарий от deep-purple

lynx - IMHO нет, а вот elinks - да. elinks знает и про графику и про js

vel ★★★★★
()
Ответ на: комментарий от urxvt

Ну а как ты себе это представляешь?

--page-requisites, применяющийся только к указанному для скачивания адресу или --allow/--reject, _не_ применяющиеся к указанному адресу. Этого бы хватило :)

Wget запускает интерпретаторы

Он _уже_ работает, как мне надо в плане разбора страниц. Вопрос только в его взаимодействии с вторичными страницами.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Вопрос только в его взаимодействии с вторичными страницами.

Там несколько доменов?
При тесте одном домене вроде бы отрабатывает так, как вы и хотели.

ArcFi
()
Ответ на: комментарий от ArcFi

Там несколько доменов?

В общем случае — да...

При тесте одном домене вроде бы отрабатывает так, как вы и хотели.

... но, увы, даже с одним доменом не отрабатывает. Как --page-requisites, так и --accept/--reject работает одинаково и с прямо указанной страницей, и со всеми страницами по ссылкам. Пример простейший:

wget --page-requisites --reject '*.html' http://www.linux.org.ru/


Останется всё, кроме самой index.html :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Останется всё, кроме самой index.html

Ну так вызови wget дважды - один раз командой, которая качает всё кроме самой страницы, а второй раз только эту страницу без всего лишнего. Или требуется именно за один вызов всё получить?

NightOperator ★★★
()
Ответ на: комментарий от KRoN73

Попробуй через

--accept-regex urlregex
--reject-regex urlregex
    Specify a regular expression to accept or reject the complete URL.

--regex-type regextype
    Specify the regular expression type.  Possible types are posix or pcre.
    Note that to be able to use pcre type, wget has to be compiled with libpcre support.

ABW ★★★★★
()
Ответ на: комментарий от NightOperator

Ну так вызови wget дважды

Ссылки будут некорректно обновлены.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от ABW

Попробуй через

Тут всё ещё хуже. --reject-regex работает только с оригинальным URL. И если запретить выкачивание .html, то индексные файлы (львиная доля случаев) по-прежнему качаются. Даже не только индексные, на главной ЛОРа, например, скачивается about.html

KRoN73 ★★★★★
() автор топика

httrack как-то странно работает с управлением фильтров, но если без него и качать тупо, то, вроде, вполне удовлетворяет результат, типа:

httrack http://www.linux.org.ru/ -* +*.gif +*.jpg +*.png +*.css +*.js -r2 -n -c8 -%T -%u -%s -%v


Правда, неудобно, что все типы нужно в фильтрах явно указывать. Ну и не поддерживается конвертация srcset на главной ЛОРа :)

Если фильтры убрать, типа такого:
httrack http://www.linux.org.ru/ -r2 -n -c8 -%T -%u -%s -%v


То выкачивается аж на 20Мб html-файлов, но зато, внезапно, откуда-то качаются и картинки для srcset :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Парсинг фильтров в httrack — это загадка. Исходный html:

<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/themes/arras-theme/js/jquery.validate.min.js'></script>
<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/themes/arras-theme/js/jquery.equalheights.min.js'></script>
<script type='text/javascript' src='http://userapi.com/js/api/openapi.js?ver=3.4.2'></script>
<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/plugins/vkontakte-api/js/callback.js?ver=3.4.2'></script>
<script type='text/javascript' src='https://apis.google.com/js/plusone.js?ver=3.4.2'></script>
<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/plugins/fancybox-for-wordpress/fancybox/jquery.fancybox.js?ver=1.3.4'></script>


Это результат выкачивания и преобразования ссылок:
<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/themes/arras-theme/js/jquery.validate.min.js'></script>
<script type='text/javascript' src='http://chornobyl.in.ua/wp-content/themes/arras-theme/js/jquery.equalheights.min.js'></script>
<script type='text/javascript' src='../userapi.com/js/api/openapiccfb.js?ver=3.4.2'></script>
<script type='text/javascript' src='wp-content/plugins/vkontakte-api/js/callbackccfb.js?ver=3.4.2'></script>
<script type='text/javascript' src='../apis.google.com/js/plusoneccfb.js?ver=3.4.2'></script>
<script type='text/javascript' src='wp-content/plugins/fancybox-for-wordpress/fancybox/jquery.fancyboxc412.js?ver=1.3.4'></script>


Часть выкачивается и преобразовывается, часть — нет. Найдите 10 отличий в исходных ссылках :)

Update: а, понял, дело в robots.txt :)

KRoN73 ★★★★★
() автор топика
Последнее исправление: KRoN73 (всего исправлений: 1)

Нет, httrack тоже задачу не решает :-/

Проблема в картинках, на которые ссылается страница. Т.е.:

<a href="/full-image"><img src="image" /></a>

Если ограничиваться глубиной выкачивания -r1, то превьюшка качается, полная картинка — нет. Если ставить -r2, то выкачиваются, порой, тысячи файлов — вплоть до всего сайта.

Если ставить фильтры по расширениям (-* +*.gif +*.jpg +*.png +*.css +*.js), то с -r2 результат сносный. Но у картинок часто вообще нет расширения и этот метод не работает.

Если ставить фильтры по MIME (-mime:*/* +mime:image/* +mime:text/*), то с -r2 опять качается [почти] весь сайт, только что кроме картинок и html ничего не останется, но прочего итак мало. Если в mime убирать text/html, то, болезнь wget, не качается и та страница, которую сказали выкачать.

Блин. Простейшая задача в рамках того, что уже умеют wget и httrack, но ни тот, ни другой, решить её не могут :D

KRoN73 ★★★★★
() автор топика
Последнее исправление: KRoN73 (всего исправлений: 1)

wget умеет фильтры

   Recursive Accept/Reject Options
       -A acclist --accept acclist
       -R rejlist --reject rejlist
           Specify comma-separated lists of file name suffixes or patterns to
           accept or reject. Note that if any of the wildcard characters, *,
           ?, [ or ], appear in an element of acclist or rejlist, it will be
           treated as a pattern, rather than a suffix.  In this case, you have
           to enclose the pattern into quotes to prevent your shell from
           expanding it, like in -A "*.mp3" or -A '*.mp3'.

       --accept-regex urlregex
       --reject-regex urlregex
           Specify a regular expression to accept or reject the complete URL.

       --regex-type regextype
           Specify the regular expression type.  Possible types are posix or
           pcre.  Note that to be able to use pcre type, wget has to be
           compiled with libpcre support.

futurama ★★★★★
()
Ответ на: комментарий от futurama

wget умеет фильтры

Я прямо в топикстарте расписал, что с ними не так.

KRoN73 ★★★★★
() автор топика

В общем, пока совсем забил на ссылающиеся картинки. Лучше иметь страницу с превьюшками и без полных картинок, чем не иметь ничего :)

Примеры сохранённых страниц:

http://gateway.ipfs.io/ipfs/QmVQzXn8pNGDMMdFneffktMKfrUFw7txFv6mBTo3SY71NM

http://gateway.ipfs.io/ipfs/Qmb1Xxv8FoRhMYyqHWpc2hqiedWcS2sTy9eiwuqM5wFXBs

По второй ссылке, кстати, картинки по ссылкам почему-то сохранились. Я так и не понял, чем первая страница отличается от второй, что там картинки не сохраняются, а тут - да :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

По второй ссылке, кстати, картинки по ссылкам почему-то сохранились

Тьфу. Просто картинки по ссылкам — такие же, как и в img :) Ссылка на тот же файл :D

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.