web-dev-qa-db-ja.com

wget Webクローラーは、不要なindex.htmlインデックスファイルを取得します

いくつかのWebディレクトリをローカルディスクに保存する~/.bashrc関数を作成しました。 Webサイトに存在しない不要なインデックスファイルを除いて、正常に機能します。私はそれを次のように使用します

crwl http://ioccc.org/2013/cable3/  

ただし、index.html?C=D;O=A index.html?C=D;O=D index.html?C=M;O=A index.html?C=M;O=D index.html?C=N;O=A index.html?C=N;O=D index.html?C=S;O=A index.html?C=S;O=Dなどの一部のファイルも取得します

完全なファイルリスト:

 kenn@kenn:~/experiment/crwl/ioccc.org/2013/cable3$ ls
 bios        index.html?C=D;O=A  index.html?C=S;O=A           screenshot_flightsim4.png
 cable3.c    index.html?C=D;O=D  index.html?C=S;O=D           screenshot_Lotus123.png
 fd.img      index.html?C=M;O=A  Makefile                     screenshot_qbasic.png
 hint.html   index.html?C=M;O=D  runme                        screenshot_simcity.png
 hint.text   index.html?C=N;O=A  sc-ioccc.terminal            screenshot_win3_on_macosx.png
 index.html  index.html?C=N;O=D  screenshot_autocad.png

wgetを使用してそのディレクトリを複製するときにこれらのファイルを除外したいのですが、Webディレクトリをそのまま複製するwgetスイッチまたはトリックはありますか?

.bashrcのスクリプト関数:

crwl() {
wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent "$@"

}

編集:2つの可能な回避策を見つけました

1)-R index.html?*フラグの追加

2)-R =A,=Dを除くindex.html?C=D;O=Aファイルを拒否するindex.htmlフラグを追加する

どちらが適切かはわかりませんが、どちらも安全ではないようです。

3
kenn

Wgetの削除メカニズムを使用したくない場合、またはこのオプションをサポートしていないシステム上にいる場合は、ダウンロード後にこれを試してください。

FIND=$($WHICH find)
PWD2=$($WHICH pwd)
SH=$($WHICH sh)
ECHO=$($WHICH echo)
LESS=$($WHICH less)

コマンド:

$FIND "$($PWD2)" -regextype posix-egrep -type f -regex '^(.*?html\?C=[DNSM];O=[AD])$' -exec "$SH" -c 'o="{}";$ECHO -f -v "${o}"' \; | $LESS

出力に満足したら、次の手順を実行します。

  1. 次のコマンドを発行します(下のボックスを参照)
  2. 上記のコマンドの$ ECHOを$ RMに置き換えます。
  3. 実際の出力を取得するには、パイプ(|)と$ LESSを削除します。

(ファイルシステム全体を削除する場合、私は責任を負いません。したがって、この方法です。)

RM=$($WHICH rm);export RM
$FIND "$($PWD2)" -regextype ... ;$RM -f -v "${xox}"' \; 

お役に立てれば。

1

他の種類のindex.html?C=...ファイルを除外せずにURL index.html*のようなインデックスソートファイルを除外するには、実際により正確な指定が可能です。試してください:-R '\?C='

クイックデモ

別の空のディレクトリを設定します、例えば

$ mkdir ~/experiment2
$ cd ~/experiment2

次に、1ページの簡単なテストを行うために、再帰とレベルを使用せずに、コマンドの短いバージョンを作成します。

$ wget --tries=inf --timestamping --convert-links --page-requisites --no-parent -R '\?C=' http://ioccc.org/2013/cable3/

Wgetが完了すると、~/experiment2にはindex.html?C=...ファイルがなくなります。

.
└── ioccc.org
    ├── 2013
    │   └── cable3
    │       └── index.html
    ├── icons
    │   ├── back.gif
    │   ├── blank.gif
    │   ├── image2.gif
    │   ├── text.gif
    │   └── unknown.gif
    └── robots.txt

4 directories, 7 files

したがって、他のすべてのindex.htmlディレクトリ、この場合はただindex.html?C=...を保持しながら、実際にこれらの冗長なインデックスソートindex.htmlディレクトリを除外しました

実装する

したがって、-R '\?C='のシェル関数を更新して、~/.bashrcを実装するだけです。

crwl() {
  wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent -R '\?C=' "$@"
}

次に、新しいターミナルでテストするか、bashを再ソースして有効にすることを忘れないでください。

$ . ~/.bashrc

次に、比較のために新しいディレクトリで試してください:

$ mkdir ~/experiment3
$ cd ~/experiment3
$ crwl http://ioccc.org/2013/cable3/

保証

  • wget 1.14以降のみ。したがって、wget -Vが1.13である場合、これは機能しない可能性があり、これらの厄介なindex.html?C=...を実際に削除するか、wgetの最新バージョンを取得する必要があります。
  • -Rまたはパターンを拒否するように指定することで機能します。この場合、?C=index.html?C=...バージョンに典型的なindex.htmlパターンを持つページです。
  • ただし、?はたまたまwgetワイルドカードであるため、リテラル?と一致させるには、\?としてエスケープする必要があります。
  • wgetを中断しないでください。 wgetがブラウズ可能なWebページで動作する方法は、実際に最初にダウンロードし、後でクロールするリンクがさらにある場合にチェックする必要があるかのように、後で削除することです。したがって、これを途中でキャンセルしても、index.html?C=ファイルになります。 wgetを終了させた場合のみ、wgetは-R仕様に従い、一時的にダウンロードされたindex.html?C=...ファイルを削除します
1
clarity123