Захватите содержимое ресурса в CasperJS или PhantomJS
Я вижу, что у CasperJS есть функция "загрузка" и обратный вызов "на ресурсе", но я не вижу содержимого ресурса в обратном вызове, и я не хочу загружать этот ресурс в файловую систему.
Я хочу захватить содержимое ресурса, чтобы я мог что-то сделать с ним в моем script. Возможно ли это с помощью CasperJS или PhantomJS?
Ответы
Ответ 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 (доступно для последнего мастера)