如何使用--accept-regex选项下载带有wget的网站?

时间:2017-05-27 01:13:13

标签: regex wget

我正在尝试下载我的网站存档 - 3dsforums.com - 使用wget,但我想要下载数百万个页面,所以我正在尝试告诉wget只下载符合某些网址格式的网页,但我遇到了一些障碍。

例如,这是我想下载的网址:

http://3dsforums.com/forumdisplay.php?f=46

...所以我尝试使用--accept-regex选项:

wget -mkEpnp --accept-regex "(forumdisplay\.php\?f=(\d+)$)" http://3dsforums.com

但它只是下载网站的主页。

到目前为止远程工作的唯一命令如下:

wget -mkEpnp --accept-regex "(\w+\.php$)" http://3dsforums.com

这提供了以下回复:

Downloaded 9 files, 215K in 0.1s (1.72 MB/s)
Converting links in 3dsforums.com/faq.php.html... 16-19
Converting links in 3dsforums.com/index.html... 8-88
Converting links in 3dsforums.com/sendmessage.php.html... 14-15
Converting links in 3dsforums.com/register.php.html... 13-14
Converting links in 3dsforums.com/showgroups.php.html... 14-29
Converting links in 3dsforums.com/index.php.html... 16-80
Converting links in 3dsforums.com/calendar.php.html... 17-145
Converting links in 3dsforums.com/memberlist.php.html... 14-99
Converting links in 3dsforums.com/search.php.html... 15-16
Converted links in 9 files in 0.009 seconds.

我的正则表达式有问题吗?或者我误解了--accept-regex选项的使用?我今天一直在尝试各种各样的变化,但我不太了解实际问题是什么。

1 个答案:

答案 0 :(得分:2)

wget默认使用POSIX正则表达式\d类表示为[:digit:]\w类表示为[:word:],加上为什么所有分组?如果您的wget使用PCRE支持进行编译,那么您可以更轻松地完成工作,并执行以下操作:

wget -mkEpnp --regex-type pcre --accept-regex“forumdisplay.php \?f = \ d + $”http://3dsforums.com

但是...因为您的论坛软件会创建自动会话ID(s=<session_id>)并将其注入所有链接,因此无法正常工作,因此您还需要考虑这些内容:

wget -mkEpnp --regex-type pcre --accept-regex "forumdisplay\.php\?(s=.*)?f=\d+(s=.*)?$" http://3dsforums.com

唯一的问题是,现在您的文件将以其名称中的会话ID保存,因此您必须在wget完成时添加另一个步骤 - 批量重命名具有会话ID的所有文件他们的名字。您可以通过将wget管道传输到sed来实现,但我会留给您:)

如果你的wget不支持PCRE,这种模式最终会很长,但我们希望它能做到......