20

CasperJS には「ダウンロード」機能と「on resource received」コールバックがありますが、コールバックにリソースの内容が表示されず、リソースをファイルシステムにダウンロードしたくありません。

リソースのコンテンツを取得して、スクリプトで何かを実行できるようにしたいと考えています。これは CasperJS または PhantomJS で可能ですか?

4

4 に答える 4

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 ヘッダーが解析されませんでした。しかし、これは私にとっては便利です。他の誰かが見つけてくれることを願っています。特定のコンテンツ タイプに問題がある場合は、変更してください。

于 2013-02-05T21:14:56.843 に答える
16

問題 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 を提供してくれないのでしょうか? 罰金!私たちはそれを難し​​い方法で行います!

于 2012-08-24T21:34:46.513 に答える
2

次のようにドキュメントオブジェクトからソースを取得できることに気づきませんでした:

casper.start(url, function() {
    var js = this.evaluate(function() {
        return document; 
    }); 
    this.echo(js.all[0].outerHTML); 
});

詳細はこちら

于 2012-10-24T17:07:59.373 に答える
1

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 (最新のマスターで利用可能)

于 2012-07-18T05:05:58.113 に答える