CasperJS には「ダウンロード」機能と「on resource received」コールバックがありますが、コールバックにリソースの内容が表示されず、リソースをファイルシステムにダウンロードしたくありません。
リソースのコンテンツを取得して、スクリプトで何かを実行できるようにしたいと考えています。これは CasperJS または PhantomJS で可能ですか?
この問題は、ここ数日間私の邪魔をしていました。プロキシ ソリューションは私の環境ではあまりきれいではなかったので、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 ヘッダーが解析されませんでした。しかし、これは私にとっては便利です。他の誰かが見つけてくれることを願っています。特定のコンテンツ タイプに問題がある場合は、変更してください。
問題 158 http://code.google.com/p/phantomjs/issues/detail?id=158によると、phantomjs が少し成熟するまで、これは彼らにとって少し頭痛の種であることがわかりました。
じゃあどうしてもやりたいの?私はこれを達成するためにもう少し上に行くことを選択し、 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
次にproxyを指定してphantomjsを実行すると……
phantomjs --ignore-ssl-errors=yes --cookies-file=cookies.txt --proxy=127.0.0.1:8080 --web-security=no myfile.js
セキュリティをオンにしたい場合などがありますが、現在は 1 つのソースのみをスクレイピングしているため、不要でした。プロキシ コンソールを通過する大量のテキストが表示されるはずです。「text/x-comma-separated-values」の MIME タイプのテキストが表示されると、data.csv として保存されます。これにより、すべてのヘッダーとすべてが保存されますが、ここまで来た場合は、それらをポップする方法を理解できると確信しています.
もう1つの詳細は、gzipエンコーディングを無効にする必要があることがわかりました.zlibを使用して、自分のApache Webサーバーからgzipでデータを解凍できますが、IISなどからの解凍でエラーが発生し、.その部分についてはわかりません。
電力会社は API を提供してくれないのでしょうか? 罰金!私たちはそれを難しい方法で行います!
次のようにドキュメントオブジェクトからソースを取得できることに気づきませんでした:
casper.start(url, function() {
var js = this.evaluate(function() {
return document;
});
this.echo(js.all[0].outerHTML);
});
詳細はこちら。
Casper.debugHTML()
HTML リソースのコンテンツを印刷するために使用できます。
var casper = require('casper').create();
casper.start('http://google.com/', function() {
this.debugHTML();
});
casper.run();
次を使用して HTML コンテンツを var に保存することもできますcasper.getPageContent()
: http://casperjs.org/api.html#casper.getPageContent (最新のマスターで利用可能)