通过wget命令抓取sitemap.xml中的链接

14

我尝试爬取网站地图sitemap.xml中的所有链接以重新缓存网站。但是,wget的递归选项无法正常工作,我只得到如下响应:

远程文件存在,但不包含任何链接--不检索。

但是,确实sitempa.xml中充满了“http://…”链接。

我尝试了几乎所有的wget选项,但对我来说都没有用:

wget -r --mirror http://mysite.com/sitemap.xml

有人知道如何打开网站sitemap.xml中的所有链接吗?

谢谢, Dominic

4个回答

17

看起来wget无法解析XML,因此您需要手动提取链接。您可以执行以下操作:

wget --quiet http://www.mysite.com/sitemap.xml --output-document - | egrep -o "https?://[^<]+" | wget -i -

我从这里学到了一个技巧。


2
我该如何将每个下载的HTML文件名设置为页面标题?目前所有文件名都是index.html,index.html.1,index.html.2等。 - user2028856
有没有人能详细解释一下,考虑到XML文件结构中的许多子元素...?不过这很好!谢谢! - lcm
我有以gz格式存储的站点地图,我应该如何访问其中的URL。 - lightsaber
另外,我想获取未在网站地图中列出的 .amp 页面。如何从这些 URL 创建 amp URL。我的 amp URL 使用 .amp 扩展名。 - lightsaber

4

虽然这个问题比较旧,但我通过谷歌找到了这里。

最终我使用xsltproc解析sitemap.xml:

sitemap-txt.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
            xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
    <xsl:template match="/">
        <xsl:for-each select="sitemap:urlset/sitemap:url">
            <xsl:value-of select="sitemap:loc"/><xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

使用它(在这种情况下它是来自缓存预热脚本的,因此检索到的页面不会被保留(“-o / dev / null”),只打印一些统计信息(“-w ....”)):

curl -sS http://example.com/sitemap.xml | xsltproc sitemap-txt.xsl - | xargs -n1 -r -P4 curl -sS -o /dev/null -w "%{http_code}\t%{time_total}\t%{url_effective}\n"

(将此重写为使用wget而不是curl是读者的练习;-))

  1. 检索sitemap.xml
  2. 解析站点地图,将URL列表作为文本输出(每行一个URL)
  3. 使用xargs调用"curl"访问每个URL,并使用4个并行请求

这应该被标记为答案。根据网站地图模式解析XML是唯一可靠的解决方案。 - Andrew Bate
非常好的答案,谢谢! - Jan Święcki

0
Orient还提供免费的网站爬虫和网站地图生成器。

有任何关联吗?/help/promotion - undefined

-2
你可以使用其中一个网站地图工具。试试Slickplan。它有网站爬虫选项,通过使用它,您可以导入现有网站的结构并从中创建可视化网站地图。然后,您可以将其导出为Slickplan XML格式,其中包含不仅链接,还包括SEO元数据、页面标题(产品名称)和其他一些有用的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接