我正在尝试下载我的网站存档 - 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
选项的使用?我今天一直在尝试各种各样的变化,但我不太了解实际问题是什么。
答案 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,这种模式最终会很长,但我们希望它能做到......