LINUX.ORG.RU

Получить имя файла из HTTP-заголовка curl -I (grep? sed?)


0

0

На некоторых вебсайтах ссылки на скачивание файлов имеют вид
http://website.com/index.php?section=12&page=322&attach=28
а имя файла можно получить, например, вызвав HTTP-заголовок командой
curl -I "http://website.com/index.php?section=12&page=322&attach=28".

Чтобы массово скачать файлы с такого сайта, я ищу в заголовке grep-ом строку вида
filename="file216.doc"
и вырезаю имя sed-ом. При этом в конце имени оказывается символ конца строки.

Как вырезать имя файла без символа конца строки?

Если посоветуете сменить curl на wget, объясните, пожалуйста, как в нём подставлять куки, подменять юзер-агент и игнорировать robots.txt без правки ~/.wgetrc ?

Заранее спасибо.

★★★★★

а что если сервер тебе не захочет отвечать на запрос HTTP HEAD? error 400 какой-нить :)

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

> а что если сервер тебе не захочет отвечать на запрос HTTP HEAD? error 400 какой-нить :)

Тогда curl не сможет записать страницу с сообщением об ошибке и выругается "Failed writing body". Если необходимо чётко отследить, все ли файлы скачались, добавляю к именам кусок URL. Но в случае сегодняшнего сайта я уверен в работе всех линков.

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

> tr -d '\n'

> Либо tr -d '\r\n'

Спасибо, но я надеялся, что можно как-то обойтись одним sed-ом. (А лучше избавиться и от grep-а.)

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

> Чтобы массово скачать файлы с такого сайта, я ищу в заголовке grep-ом строку вида
> filename="file216.doc"

может проще wget ?

       --content-disposition   honor the Content-Disposition header when
                               choosing local file names (EXPERIMENTAL).

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

> --content-disposition honor the Content-Disposition header when choosing local file names (EXPERIMENTAL).

Не знаю, включено оно по умолчанию, или действует другая опция, но имена в подобных случаях оно распознаёт и без этого ключа. В таком случае у меня другой вопрос: как ему подсунуть куки, поменять user-agent и игнорировать robots.txt без правки ~/.wgetrc?

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

не знаю какая версия у тебя (такая возможность есть только в последних), но по идее по умолчанию не включено

wget -e --robots=off ...

  -e,  --execute=COMMAND   execute a `.wgetrc'-style command.
  -U,  --user-agent=AGENT      identify as AGENT instead of Wget/VERSION.
       --load-cookies=FILE     load cookies from FILE before session.
       --save-cookies=FILE     save cookies to FILE after session.
       --keep-session-cookies  load and save session (non-permanent) cookies.
       --content-disposition   honor the Content-Disposition header when
                               choosing local file names (EXPERIMENTAL).

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

> не знаю какая версия у тебя

1.11.1

> --robots=off

Такой опции не знает. Обновиться?

> -e, --execute=COMMAND

Спасибо, не знал.

> -U, --user-agent=AGENT

Починили уже?

> --load-cookies=FILE --save-cookies=FILE --keep-session-cookies

Спасибо.

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

вообще если какие то проблемы, то у wget есть очень полезная опция --debug, и с прошлого года у них есть bugtrack за которым следят

> 1.11.1

должно быть достаточно, можно не обновлять

> --robots=off Такой опции не знает.

опции --robots=off нет, есть -e --robots=off которая действует как написано выше ("robots=off" учитывается как строка из wgetrc)

> -U, --user-agent=AGENT Починили уже?

у меня всё работает, но если есть проблемы используй --header "User-agent: Opera" (тоже делает замену заголовка, так можно и с другими, в том числе cookies или левой авторизацией)

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