wget 网络爬虫检索不需要的 index.html 索引文件

wget 网络爬虫检索不需要的 index.html 索引文件

我创建了一个~/.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 是否有任何wget开关或技巧可以按原样克隆 Web 目录?

我的脚本功能在.bashrc

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

}

编辑:我发现了两种可能的解决方法

1)添加-R index.html?*标志

2)添加-R =A,=D拒绝 index.html?C=D;O=A以下文件的标志,但index.html

我不知道哪一个是合适的,但它们似乎都不安全。

答案1

为了排除索引排序文件(例如带有 URL 的文件),index.html?C=...而不排除任何其他类型的index.html*文件,确实可以进行更精确的规范。请尝试:-R '\?C='

快速演示

设置不同的空目录,例如

$ mkdir ~/experiment2
$ cd ~/experiment2

然后使用命令的较短版本,没有递归和级别,以便快速进行一页测试:

$ 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-sortindex.html?C=...目录,同时保留了所有其他 index.html 目录,在本例中只是index.html

实施

-R '\?C='因此,只需通过更新 shell 函数来实现~/.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 处理可浏览网页的方式似乎是先下载,然后再删除,好像它需要检查这些页面是否有进一步的链接需要抓取。所以如果你中途取消,你仍然会得到index.html?C=文件。只有你让 wget 完成,wget 才会按照你的要求-R删除任何临时下载的index.html?C=...文件

答案2

如果您不想使用 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}"' \; 

希望这可以帮助。

相关内容