であればウェブサイト PDFダウンロード自動起動:https://magazines-static.raspberrypi.org/issues/full_pdfs/000/000/308/original/MagPi89.pdf?1576682030
full_pdfs/000/000/308
私はMagPi誌に手紙を書いていましたが、次の数字308はランダムな数字であると説明しました。
簡単に言うと、ダウンローダの問題を解決する必要がありました。https://github.com/joergi/MagPiDownloader/issues/15すべての問題をコピーして貼り付ける必要はありません。だから自動フォローはいいと思います。
しかし、私が試したことはすべて:
curl -JLO https://magpi.raspberrypi.org/issues/89/pdf
そして
wget --user-agent=Mozilla --content-disposition -E -c https://magpi.raspberrypi.org/issues/80/pdf
百水。
答え1
ウェブサイトのHTMLを調べてみると」PDFダウンロード「リンクは、http-eqiv = "refresh」属性を持つメタ要素を使用して実際のリンクにリダイレクトされます。または、curl
同じツールはwget
標準を処理できます。httpリダイレクト、HTMLを解析または解釈しないため、このタイプのリダイレクトを処理できません。私たちはシェルを使用しているので、可能な解決策の1つは、curl
ページを使用またはダウンロードし、wget
htmlをフィルタリングすることによってhttp-eqiv="refresh"
。
サイトで新しいバージョンにアクセスできなくなったようです。https://www.raspberrypi.org/magpi-issues/(過去の問題#86なし)現在のスクリプトがどのように機能するか(つまり、本質的にPDFリンクの静的データベース)が直観に反しているようです。これ特別号ダウンロードスクリプトリストされているのと同じPDFが複数あるようです。https://magpi.raspberrypi.org/booksしかし、スクリプトには最新バージョンがありません。
だから、もっとダイナミックなスクリプトを作成しようとしました。見える/書籍&/質問利用可能/最新のコンテンツを確認してください。必要に応じて、次のいずれかを使用できます。zsh
、gawk
&を使用しますcurl
。
#!/usr/bin/env zsh
typeset -aU standard book ignore directory
typeset all latest list_books all_books baseurl="https://magpi.raspberrypi.org/"
setopt extendedglob
function books() {
typeset -aU books filter minus
typeset i
>&2 echo "getting list of available books..."
books=( $(2>/dev/null curl -fs ${baseurl}books | gawk -v 'RS=href="' -F '"' \
'$1 ~ /^[/]books[/][^/]*[/]pdf$/{split($1,a,"/"); print "books/"a[3]}') )
if [[ -z $books ]]
then
>&2 echo "unable to find any books"
return 0
fi
case $1 in
(list)
printf '\t%s\n' $books
return 0
;;
(all)
>&2 echo "Attempting to download all the books, this may take a while ..."
>&2 printf '\t%s\n' $books
get_pdfs $books
return 0
;;
(*)
for i in $@
do
case $i[1] in
(-)
minus+=( ${(M)books:#*${i:1}*} )
books=( ${books:#*${i:1}*} )
;;
(*)
filter+=( ${(M)books:#*$i*} )
;;
esac
done
if [[ -z $filter && -n $minus ]]
then
filter=( ${books:|minus} )
else
filter=( ${filter:|minus} )
fi
if [[ -z $filter ]]
then
>&2 echo "books: no matches found (try book:list)"
return 0
else
>&2 printf '\t%s\n' $filter
get_pdfs $filter
fi
;;
esac
}
function issues() {
typeset -aU issues
typeset max i
>&2 printf '%s' "finding most recent issue # ..."
if ! max=${(M)$(2>/dev/null curl -fs https://magpi.raspberrypi.org/issues | gawk -v 'RS=href="' -F '"' \
'$1 ~ /^[/]issues.*[0-9]$/{a=$1;exit}
END{if(a){print a} else{exit 1}}')%%[0-9]#}
then
>&2 echo "couldn't determine what number the latest issue is."
return 1
fi
>&2 echo "it's $max"
if [[ $1 = all ]]
then
>&2 echo "Attempting to download all the issues, this may take a while ..."
get_pdfs issues/{1..$max}
return 0
fi
if [[ -n $latest ]]
then
issues+="issues/$max"
fi
for i in $@
do
if [[ $i -le $max ]]
then
issues+="issues/$i"
else
>&2 echo "issues/$i is larger than $max, ignoring"
fi
done
if [[ -z $issues ]]
then
>&2 printf '\t%s\n' "there are no issues to download"
return 0
fi
>&2 printf '\t%s\n' $issues
get_pdfs $issues
return 0
}
function get_pdfs() {
typeset url i
for i in $@
do
if ! url=$(2>/dev/null curl -fs "$baseurl$i/pdf" | \
gawk -v 'RS=http-equiv="[rR]efresh".*[0-9 ;]*[uU][rR][lL]=' -F '"' \
'$1 ~ /^http.*[.]pdf/{a=$1;exit}
END{if(a){print a} else{exit 1}}')
then
>&2 echo "unable to extract url for $i"
continue
fi
if [[ -e ${directory:+$directory[-1]/}${${url##*/}%%\?*} ]]
then
>&2 echo "looks like $i was already downloaded to ${directory:+$directory[-1]/}${${url##*/}%%\?*}"
continue
fi
curl -f --create-dirs -o ${directory:+$directory[-1]/}${${url##*/}%%\?*} $url
done
}
if ! zparseopts -D 'd:=directory'
then
return 1
fi
if [[ -z $@ ]]
then
>&2 printf '\t%s\n' \
"[-d DIRECTORY]" \
"[NUMBER] ... download issue by number" \
"[latest] download most recent issue" \
"[all] download all issues" \
"[book:list] list all books" \
"[book:WORD] ... download books matching WORD" \
"[book:-WORD] ... don't download books matching WORD" \
"[book:all] download all books" \
"... no args specified, nothing to do ... exiting"
return 0
fi
if [[ -n $directory ]]
then
if ! mkdir -p $directory[-1]
then
return 1
fi
>&2 echo "files will be saved in $directory[-1]"
fi
for (( i=1; i<=${#@}; i++ ))
do
case ${@[i]} in
(all) all=all ;; #download all standard issues
(latest) latest=1 ;; #download most recent issue
(book:list) list_books=list ;; #print a list of books
(book:all) all_books=all ;; #download all books
(book:[[:alnum:]-]##) book+=( ${@[i]#*:} ) ;; #download matching books (or books not matching if book:- is used)
([0-9]##) standard+=${@[i]} ;; #download standard issue by number
(*) ignore+=${@[i]} ;; #tell user about unused args
esac
done
if [[ -n $list_books || -n $all_books || -n $book ]] #book argument was specified - get books
then
books ${list_books:-${all_books:-$book}}
fi
if [[ -n $standard || -n $latest || -n $all ]] #issue args - get issues
then
issues $all $standard
fi
if [[ -n $ignore ]]
then
>&2 printf '\t%s\n' "the following arguments were ignored:" $ignore
fi
return 0
スクリプトの最後に、使用法を説明するいくつかの説明があります。
- 有効な質問関連の引数は次のとおりです。
latest
またはall
aNUMBER
– たとえば、範囲を指定するためにスクリプトを呼び出すときにシェル拡張を使用できます。 bash / zshから問題12〜15をダウンロードするには、{12..15}
12〜15に拡張する必要があることを指定してください。 - 有効な書籍関連パラメータには
book:list
、book:all
またはbook:WORD
一致、除外book:-WORD
などがあります。book:{begin,-3rd}
「Book 3」を除く「Beginner」シリーズの本がダウンロードされます。 -d DIR
指定したディレクトリにファイルを出力するオプション- パラメーターのすべての組み合わせは有効でなければならず、無効なパラメーターは無視されます。
- ダウンロードを再開せずに
-C -
オプションを最終コマンドに追加し、以前のファイル競合テストから削除するだけです。curl
get_pdfs()
continue
私が逃した部分があるかもしれません。使用に伴う責任はご自身にあります!
HTMLリダイレクトに従うためにカールを使用する例は、上記の関数にありますget_pdfs()
。
url=$(curl -fs <url_of_document_using_html_redirect> | \
gawk -v \
'RS=http-equiv="[rR]efresh" *content="[0-9 ;]*[uU][rR][lL]=' \
-F '"' \
'/^http/{print $1;exit}')
それから私達はダウンロードできるべきです"$url"