使用phantomjs抓取站点地图

Using phantomjs to crawl a sitemap

本文关键字:地图 站点 抓取 phantomjs 使用      更新时间:2023-09-26

我对phantomjs很陌生。我花了很长时间来处理以下问题。我知道我错过了一些很简单的东西。我有以下sitemap.xml:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <url>
    <loc>/</loc>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>/vehicles</loc>
    <lastmod>2013-01-07</lastmod>
  </url>
</urlset>

现在我要做的就是使用phantomjs从xml文档中获取url值。

page.open("sitemap.xml", function(status) {
    if(status !== "success") {
        console.log("Unable to open sitemap.");
    } else {
        // Stuck here
        console.log(page.content);
    }
});

xml文件的内容正确地打印到屏幕上,但是我现在如何使用文档来处理xml呢?我只需要能够得到每个url节点的第一个子节点。我尝试将xml文档解析为DOMParser,但这似乎不正确。非常感谢您的帮助。

还有你如何调试phatomjs,这样我就可以看到它的全部荣耀的对象?例如,如果我在Dev Tools中console.log一个对象,我可以展开它并看到键值对。我猜终点站不会提供这种奢侈吧?

PhantomJS允许你在页面上下文中调用javascript。看看我的解决方案,使用普通的javascript。

假设站点地图看起来像这样

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>http://example.com/</loc>
<lastmod>2014-07-07T14:09:27+00:00</lastmod>
<changefreq>always</changefreq>
</url>

我可以使用下面的代码在上述站点地图中获得url。

var page = require('webpage').create();
page.open('http://xxxx/static/sitemap/sitemap.xml', function() {
        var content = page.content;
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(content,'text/xml');
        var loc = xmlDoc.getElementsByTagName('loc');
        console.log(loc.length);
        for(var i=0; i < loc.length; i++)
        {
          var url=loc[i].textContent;
        }
        phantom.exit();
});

使用libxmljs解析xml字符串并获得您想要的数据!

另一个想法是,您可以将jQuery注入页面并像这样解析xml:

page.open("sitemap.xml", function(status) {
    if(status !== "success") {
        console.log("Unable to open sitemap.");
    } else {
        // Stuck here
        console.log(page.content);
        page.injectJs('j-query.js');//path to jquery
        var output = page.evaluate(function(){
                            return $('url *:first-child');           
                       });
    }
});

有人创建了一个使用casperjs测试XML Sitemaps的测试套件,也许您可以根据您的特定需求采用该代码。

来自作者:

此脚本将尝试在指定的站点地图中爬行,以检查子页面中是否有损坏的url,图像,css和Javascript。错误将被记录到指定的日志文件中。

用法:

casperjs sitemap_xml_testing.js --sitemap=<URL TO SITEMAP> --logfile=<LOG FILE NAME>

gmazin在Bitbucket上的自动站点地图测试