检测网页是否有JavaScript重定向

8

我正在使用cURL访问许多不同的页面。我希望找到一种简洁的方法来检查页面是否有JavaScript重定向。我可以通过检查中是否存在window.location来实现,但是因为它可能在.js文件中或使用类似jQuery的库,所以任何解决方案似乎都不会完美。有人有什么想法吗?


简单的curl请求不支持JavaScript,因此无法轻松实现。 - PeeHaa
1
如果您正在使用解析器(或编写解析器),则可以编译请求文件内容中的.js文件列表。有了该列表,您可以下载这些文件并解析它们以查找重定向的存在。由于在解析器中下载文件时可以访问源代码,因此您将能够将基本URL(从您最初使用的URL推断出)附加到文档中使用的链接以下载它们。 - renab
1
@popnoodles cURL无法触发JavaScript重定向,因此将没有要解析的URL。 - renab
是的,我后来意识到我写的内容。 - Popnoodles
1
也许你可以使用类似 capybara/selenium 的工具:http://www.christopherbloom.com/2012/03/12/testing-for-a-redirect-using-capybara-and-selenium-webdriver/ - sroes
显示剩余7条评论
4个回答

2
感谢Ikstar指出了phantomjs,我制作了以下示例: test.js
var page = require('webpage').create();
var testUrls = [
    "http://www.google.nl",
    "http://www.example.com"
];

function testNextUrl()
{
    var testUrl = testUrls.shift();
    page.open(testUrl, function() {
        var hasRedirect = page.url.indexOf(testUrl) !== 0;
        console.log(testUrl + ": " + hasRedirect.toString());
        if (testUrls.length) {
            testNextUrl();
        } else {
            phantom.exit();
        }
    });
}

testNextUrl();

结果:

D:\Tools\phantomjs-1.7.0-windows>phantomjs test.js
http://www.google.nl: false
http://www.example.com: true

你的代码如何跟进JS客户端重定向?难道不是在任何JS重定向运行之前,page.open就已经完成了吗? - CMCDragonkai

0

仅通过解析脚本是无法完成的。只有执行才能展示页面JS的真实流程。

模拟执行的一种方法是具有重定向的不同代码级别。最顶层将位于<script>标签下,任何重定向都将是直接重定向。如果在函数内发现任何重定向,则必须跟踪程序结构并进行猜测。


这取决于@madphp所说的“具有JavaScript重定向”的含义...如果他只想检测重定向的存在,那么像我在问题评论中描述的简单解析器就可以很好地工作。如果他想知道是否存在重定向并且将被执行,那么他需要进行猜测。 - renab
是的,这是个问题。我想知道在一个函数中使用window.location是否有无害的原因,比如重定向到移动版本或非Flash页面。 - madphp
@renab。是的,这就是为什么我提供了两种观点。 - footy

0

根据使用Curl的目的以及实际需要页面重定向的情况,可以使用无头框架如PhantomJS(http://phantomjs.org/)来进行必要的浏览。您将能够看到是否会发生重定向,并跟踪页面上执行的任何其他JavaScript。


0

仅通过分析网页源代码是不可能检测到重定向的存在。

停机问题是无法判定的,可以在JavaScript中进行编码。该算法可能会停止,导致生成重定向,或者永远运行。由于我们不知道代码是否会停止,因此也无法确定是否执行重定向。


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