我正在尝试复制具有以下目录结构的论坛帖子:
第一页的 URL 如下:
https://some.site.com/foo/bar/threadNumber
其余页面遵循以下格式:
https://some.site.com/foo/bar/threadNumber/page/2
https://some.site.com/foo/bar/threadNumber/page/3
https://some.site.com/foo/bar/threadNumber/page/*
我正在使用命令:
wget --recursive --page-requisites --adjust-extension --no-parent --convert-links https://some.site.com/foo/bar/threadNumber
这个命令可以很好地复制任何单个 URL。但是,我想放入更高的目录,并获取所有/page/*
文件。我不需要更高的目录,除了较低的/page/
文件之外什么都不需要。我也参与--mirror
其中,但没有成功。
你知道为什么这个命令不会降低下载其余页面的速度吗?
答案1
递归下载带有安全检查的链接会导致循环重定向。
该命令不起作用,因为您的网站使用双重重定向,这使 wget 感到困惑。让我们看一下可以使用该--debug
选项调用的详细日志(删除了不相关的行):
---request begin---
GET /<URL> HTTP/1.1
---response begin---
HTTP/1.1 302 Found
Location: https://community.lego.com/auth/securityCheck?action=bounce&referrer=https%3A%2F%2Fcommunity.lego.com%2F<URL>
(...)
---request begin---
GET /auth/securityCheck?referrer=https%3A%2F%2Fcommunity.lego.com%2F<URL> HTTP/1.1
---response begin---
HTTP/1.1 302 Found
Location: https://community.lego.com/<URL>
(...)
Deciding whether to enqueue "https://community.lego.com/<URL>".
Already on the black list.
Decided NOT to load it.
Redirection "https://community.lego.com/<URL>" failed the test.
如图所示,它会将您的请求退回到某些“安全检查”并返回。 Wget 不希望第二次重定向到您来自的同一页面,并将其视为黑名单,因此不会跟踪任何链接。
虽然绝对有可能有一种方法可以执行一些 cookie 魔法来防止安全检查重定向发生,但我不知道该怎么做。
不过,如果你愿意的话重新编译手动 wget ,解决您的问题可能很简单:只需将这两行添加到src/recur.c
.
status = retrieve_url (url_parsed, url, &file, &redirected, referer,
&dt, false, i, true);
+
+ if (redirected)
+ hash_table_remove (blacklist, url);
if (html_allowed && file && status == RETROK
&& (dt & RETROKF) && (dt & TEXTHTML))
每次重定向时,这都会将当前页面从黑名单中删除,从而解决您的问题。
请注意,在某些情况下它可能会触发无限循环,因此它不是一个可提交的补丁。
一旦你重建了 wget,你就可以使用类似的东西
wget -np -nd -r -k -p <url>
来按预期获取整个线程。
答案2
试试这个:
wget -nv --mirror --span-hosts --convert-links --adjust-extension --page-requisites --no-parent https://some.site.com/foo/bar/threadNumber
此命令获取包含来自所有站点的所有元素的整个线程。--accept html,gif,png,jpg,jpeg
例如,您可以按类型限制它。
答案3
只是在这里大声思考......像 webhttrack 这样的东西怎么样?或者首先运行jmeter - >导出链接列表 - >然后使用wget或curl?
更新 刚刚用 webhttrack 进行了测试,它正在工作,并且可以在 CLI 和 Gui 中使用......