我看到CasperJS有一个“下载”功能和一个“on resource received”回调,但我没有在回调中看到资源的内容,我不想将资源下载到文件系统。 / p>
我想获取资源的内容,以便我可以在我的脚本中使用它。这可能与CasperJS或PhantomJS有关吗?
答案 0 :(得分:17)
过去几天这个问题一直困扰着我。代理解决方案在我的环境中并不是很干净,因此我发现了phantomjs的QTNetworking核心在缓存它们时放置资源的位置。
长话短说,这是我的要点。您需要cache.js和mimetype.js文件: https://gist.github.com/bshamric/4717583
//for this to work, you have to call phantomjs with the cache enabled:
//usage: phantomjs --disk-cache=true test.js
var page = require('webpage').create();
var fs = require('fs');
var cache = require('./cache');
var mimetype = require('./mimetype');
//this is the path that QTNetwork classes uses for caching files for it's http client
//the path should be the one that has 16 folders labeled 0,1,2,3,...,F
cache.cachePath = '/Users/brandon/Library/Caches/Ofi Labs/PhantomJS/data7/';
var url = 'http://google.com';
page.viewportSize = { width: 1300, height: 768 };
//when the resource is received, go ahead and include a reference to it in the cache object
page.onResourceReceived = function(response) {
//I only cache images, but you can change this
if(response.contentType.indexOf('image') >= 0)
{
cache.includeResource(response);
}
};
//when the page is done loading, go through each cachedResource and do something with it,
//I'm just saving them to a file
page.onLoadFinished = function(status) {
for(index in cache.cachedResources) {
var file = cache.cachedResources[index].cacheFileNoPath;
var ext = mimetype.ext[cache.cachedResources[index].mimetype];
var finalFile = file.replace("."+cache.cacheExtension,"."+ext);
fs.write('saved/'+finalFile,cache.cachedResources[index].getContents(),'b');
}
};
page.open(url, function () {
page.render('saved/google.pdf');
phantom.exit();
});
然后当您调用phantomjs时,只需确保启用缓存:
phantomjs --disk-cache = true test.js
一些说明: 我写这个是为了在不使用代理或拍摄低分辨率快照的情况下在页面上获取图像。 QT对某些文本文件资源使用压缩,如果将其用于文本文件,则必须处理解压缩。另外,我运行了一个快速测试以获取html资源,并且它没有解析结果中的http标头。但是,这对我很有用,希望其他人能够找到它,如果您遇到特定内容类型的问题,请修改它。
答案 1 :(得分:16)
我发现,直到phantomjs成熟一点,根据问题158 http://code.google.com/p/phantomjs/issues/detail?id=158这对他们来说有点头疼。
所以你想要做到这一点?我已选择更高一点来完成此操作并在https://github.com/allfro/pymiproxy抓取PyMiProxy,下载,安装,设置,获取示例代码并在proxy.py中进行此操作
from miproxy.proxy import RequestInterceptorPlugin, ResponseInterceptorPlugin, AsyncMitmProxy
from mimetools import Message
from StringIO import StringIO
class DebugInterceptor(RequestInterceptorPlugin, ResponseInterceptorPlugin):
def do_request(self, data):
data = data.replace('Accept-Encoding: gzip\r\n', 'Accept-Encoding:\r\n', 1);
return data
def do_response(self, data):
#print '<< %s' % repr(data[:100])
request_line, headers_alone = data.split('\r\n', 1)
headers = Message(StringIO(headers_alone))
print "Content type: %s" %(headers['content-type'])
if headers['content-type'] == 'text/x-comma-separated-values':
f = open('data.csv', 'w')
f.write(data)
print ''
return data
if __name__ == '__main__':
proxy = AsyncMitmProxy()
proxy.register_interceptor(DebugInterceptor)
try:
proxy.serve_forever()
except KeyboardInterrupt:
proxy.server_close()
然后我开火了
python proxy.py
接下来,我使用指定的代理执行phantomjs ......
phantomjs --ignore-ssl-errors=yes --cookies-file=cookies.txt --proxy=127.0.0.1:8080 --web-security=no myfile.js
你可能想要打开你的安全等等,这对我来说是不必要的,因为我只抓一个来源。你现在应该看到一堆文本流经你的代理控制台,如果它出现在mime类型为“text / x-comma-separated-values”的东西上,它将把它保存为data.csv。这也将保存所有标题和所有内容,但是如果你已经走到这一步,我相信你可以弄清楚如何将它们弹出来。
另外一个细节,我发现我必须禁用gzip编码,我可以使用zlib并从我自己的apache webserver解压缩gzip中的数据,但是如果它来自IIS或者这样的解压缩将会出错我不确定那部分内容。
所以我的电力公司不会向我提供API?精细!我们这么做了!
答案 2 :(得分:2)
没意识到我可以像这样从文档对象中获取源代码:
casper.start(url, function() {
var js = this.evaluate(function() {
return document;
});
this.echo(js.all[0].outerHTML);
});
更多信息here。
答案 3 :(得分:1)
您可以使用Casper.debugHTML()
打印出HTML资源的内容:
var casper = require('casper').create();
casper.start('http://google.com/', function() {
this.debugHTML();
});
casper.run();
您还可以使用casper.getPageContent()
:http://casperjs.org/api.html#casper.getPageContent(最新版主中提供)将HTML内容存储在var中