以编程方式获取Web请求发起人

时间:2015-11-26 04:22:09

标签: selenium-webdriver phantomjs google-chrome-devtools casperjs selenium-chromedriver

Chrome开发工具网络标签有一个启动器列,可以准确显示启动网络请求的代码。

network tab of chrome dev tools

我希望能够以编程方式获取网络请求启动器信息,因此我可以运行带有urlrequest search string参数的脚本,并返回每个请求的详细信息。匹配request search string的网址来自url页面。因此,给定参数www.stackoverflow.comgoogle,输出可能看起来像这样(显示请求网址,行号和请求的网址):

/   19  http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
/   4291    http://www.google-analytics.com/analytics.js

我查看了PhantomJS,但是它的onResourceRequested回调没有根据文档提供任何启动器信息或可以从中派生的上下文:http://phantomjs.org/api/webpage/handler/on-resource-requested.html

是否可以使用PhantomJS或其他工具或服务如硒?

更新

从评论和答案到目前为止,似乎Phantom,Selenium或其他任何东西目前都不支持。所以这里有一个可行的替代方法:加载页面和所有资产,然后在所有文件中查找request search string的任何出现。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

您应该在针对DevTools的问题跟踪器中file a feature request。启动器信息不会在HAR中导出,因此将其从那里取出是行不通的。据我所知,现有的API也不允许这样做。

答案 1 :(得分:1)

我已经能够实现一个使用PhantomJS来获取页面加载的所有URL的解决方案,然后使用xargs,curl和grep的组合来查找这些URL的搜索字符串。

第一部分是这个PhantomJS脚本,它只输出页面请求的每个URL:

system = require('system');
var page = require('webpage').create();

page.onResourceRequested= function(req) {
    console.log(req.url);
};

page.open(system.args[1], function(status) {
    phantom.exit(1);
});

这是在行动:

$ phantomjs urls.js http://www.stackoverflow.com | head -n6
http://www.stackoverflow.com/
http://stackoverflow.com/
http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
http://cdn.sstatic.net/Js/stub.en.js?v=06bb9dbfaca7
http://cdn.sstatic.net/stackoverflow/all.css?v=af4b547e0e9f
http://cdn.sstatic.net/img/share-sprite-new.svg?v=d09c08f3cb07

对于我的问题,我对图像不感兴趣,可以通过添加phantomjs arg --load-images=no来适应这些图像。

第二部分是获取所有网址并进行搜索。仅仅输出匹配是不够的,我还需要匹配URL的上下文,理想情况下也需要哪个行号。以下是如何做到这一点:

$ cat urls | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})SEARCH_TERM(.{0,30})' | sed 's#^#% #'"

我们可以将这一切包装在一个小脚本中,我们将输出通过grep管道输出,以便在搜索字符串上突出显示颜色:

#!/bin/bash
phantomjs --load-images=no urls.js $1 | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})$2(.{0,30})' | sed 's#^#% #' | grep $2 --color=always"

然后我们可以使用它来搜索任何网站上的任何字词。在这里,我们正在stackoverflow.com上寻找adzerk.net:

enter image description here

因此,您可以看到adzerk.net请求在主堆栈流页面的第4158行附近启动。它不是一个完美的解决方案,因为调用可能与定义URL的位置完全不同,但它可能很接近,当然也是开始追踪确切调用站点的好点。

可能有更好的方法来搜索每个网址的内容。它看起来不像PhantonJS的onResourceReceived处理程序目前公开了资源内容,但有ongoing work to address that,一旦可用,所有这些都会更加简单。

答案 2 :(得分:0)

您可以使用Chrome外部流程中的Chrome debugger protocol或使用chrome.debugger中的Chrome extension API(参见How to retrieve the Initiator of a request when extending Chrome DevTool?)。