Подтвердить что ты не робот

Захватите содержимое ресурса в CasperJS или PhantomJS

Я вижу, что у CasperJS есть функция "загрузка" и обратный вызов "на ресурсе", но я не вижу содержимого ресурса в обратном вызове, и я не хочу загружать этот ресурс в файловую систему.

Я хочу захватить содержимое ресурса, чтобы я мог что-то сделать с ним в моем script. Возможно ли это с помощью CasperJS или PhantomJS?

4b9b3361

Ответ 1

Не понял, что я мог бы захватить источник из объекта документа следующим образом:

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

Подробнее здесь.

Ответ 2

Я обнаружил, что до тех пор, пока phantomjs не созревает, в соответствии с вопросом 158 http://code.google.com/p/phantomjs/issues/detail?id=158 это немного головная боль для них.

Значит, ты хочешь это сделать? Я решил пойти немного выше, чтобы выполнить это, и захватил PyMiProxy на https://github.com/allfro/pymiproxy, загрузил, установил, установил его, взял свой примерный код и сделал это в прокси .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 и декомпрессировать данные в gzip с моего собственного веб-сервера apache, но если он выходит из IIS или такой декомпрессии будет возникать ошибки и я не уверен в этой части.

Итак, моя энергетическая компания не предложит мне API? Отлично! Мы делаем это нелегко!

Ответ 3

Эта проблема была на моем пути в течение последних нескольких дней. Прокси-решение было не очень чистым в моей среде, поэтому я узнал, где phantomjs QTNetworking core кладет ресурсы, когда он кэширует их.

Короче говоря, вот мой смысл. Вам нужны файлы 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 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 из результата. Но это полезно для меня, надеюсь, кто-то еще это найдет, измените его, если у вас возникнут проблемы с определенным типом контента.

Ответ 4

Вы можете использовать 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 (доступно для последнего мастера)