アーカイブされたウェブサイトからすべてのリンク(ダウンロードではない)を抽出して印刷したいです。つまり、www.foosite.com/archive
すべてのフォルダとサブフォルダを繰り返します。
www.foosite.com/archive
シナリオ:私はダウンロード可能なファイルを含むディレクトリとサブディレクトリを含むこのようなWebアーカイブにいます。
-man.pdf
-.listing.txt
|-Books/
|-my_book.pdf
|-new_books.pdf
|-Classics/
|-Songs
|-annie's.song.mp3
|-summer.of.69.mp3
-robot.txt
................
すべてのディレクトリを(再帰的に)繰り返し、すべての(ダウンロード可能な)ファイルパス(URL)を取得します。
https://www.asite.com/man.pdf
https://www.asite.com/read.txt
https://www.asite.com/Books/my_book.pdf
https://www.asite.com/Books/new_books.pdf
https://www.asite.com/Classics/.....
https://www.asite.com/Classics/........
https://www.asite.com/Songs/annie's.song.mp3
.......
https://www.asite.com/terms.txt
............................
しかし、単純なWebナビゲーション技術をシミュレートするために使用したいシェルスクリプトでは、出力はlynx
無限の再帰に閉じ込められます(問題は実装の問題ではなく構文の問題に近いと思います)。
パスワード:
#!/bin/bash
links=`/usr/bin/lynx -dump -listonly -nonumbers $1`
function dump_primary_links() {
for link in $links
do
echo "$link" | grep -P "\/$" > /dev/null
# if link ends with "/" that's a directory
if [ $? -eq 0 ]; then
echo "primary link:$link"
print_directory_items $link
# now recursively traverse the directory
else
echo "$link" # else a normal link
fi
done
}
function print_directory_items() {
# get contents of directory
lst=`/usr/bin/lynx -dump -listonly -nonumbers $link`
for lnk in $lst
do
echo "$lnk" | grep -P "\/$" > /dev/null
# if there is a directory in $lst then travel directory recursively
if [ $? -eq 0 ]; then
link=$lnk
print_directory_items $link
else
echo "$lnk" # directory contents
fi
done
}
get_link
気づく:この場合、Python(RequestsとBeautifulsoupまたはScrapy)が良いソリューションになることを知っていますが、単純なUNIXナビゲーションシミュレーションまたは「Webディレクトリナビゲーション」が必要です。
ベストアンサー1
ミラーサイトを使用することもできますがwget
、何もダウンロードしないようにWebスパイダーとして機能するように指定することもできます。
したがって、これは可能ですが、ログを保存する必要があります。
wget --no-directories --mirror --spider "$url" 2>&1 | tee "$log"
私の場合、ログには次のようなものが見つかりました。
Spider mode enabled. Check if remote file exists.
--2017-12-19 07:19:23-- URL
grep
その後、URLを検索するために使用します。
grep -P -o -e '(?<=^--....-..-.. ..:..:..-- )(.*)' "$log"
例:
$ wget --no-directories --mirror --spider https://utw.me/file/scripts/ 2>&1 | tee log.txt
...
$ grep -P -o -e '(?<=^--....-..-.. ..:..:..-- )(.*)' log.txt
...
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2001.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2002.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2003.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2004.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2005.ass
...