2012-07-17 28 views
19

'daki kaynak içeriğinin yakalanması CasperJS'nin bir "indirme" işlevine ve "kaynak alındı" geri dönüşüne sahip olduğunu görüyorum, ancak bir kaynağın içeriğini geri aramada göremiyorum. kaynağı dosya sistemine indirin.CasperJS veya PhantomJS

Komutumda onunla bir şeyler yapabilmem için kaynağın içeriğini almak istiyorum. Bu CasperJS veya PhantomJS ile mümkün mü?

Bir HTML kaynak içeriğini yazdırmak için Casper.debugHTML() kullanabilirsiniz

cevap

2

böyle belge nesneden kaynağını kapmak olabilir fark etmedi:

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

diğer bilgiler here.

1

: casper.getPageContent() kullanarak

var casper = require('casper').create(); 

casper.start('http://google.com/', function() { 
    this.debugHTML(); 
}); 

casper.run(); 

Ayrıca var HTML içeriğini saklayabilirsiniz: http://casperjs.org/api.html#casper.getPageContent (mevcut en son ana olarak)

+1

Teşekkürler NiKo ve sanırım açık değildim, ama html sayfasının değil, diğer tüm kaynakları arıyorum. Harici css veya js dosyasını bir varlığa kaydetmek istiyorum, bu kaynakların içeriği mümkün mü? – iwek

+0

sadece protokolü doğru olarak ayarladığınızdan emin olun (örneğin, http vs https) .. açmaya çalıştığım siteyi anlamaya çalıştığım bir süredir http - https .. yöneltiyordu ve bu da tıkalı casperjs (hata?) – abbood

+0

@ iwek Kaynağın diske nasıl kaydedileceği hakkında daha fazla bilgi edinmek için bu bağlantıya bakın: http://stackoverflow.com/questions/24582307/how-to-save-the-current-webpage-with-casperjs-phantomjs http: //stackoverflow.com/users/1816580/artjom-b – iChux

16

Ben ve phantomjs biraz olgunlaşıncaya kadar, bu konuya göre 158 http://code.google.com/p/phantomjs/issues/detail?id=158 bu onların için bir baş ağrısı olduğunu buldu.

Yani yine de yapmak istersiniz? Bunu gerçekleştirmek için biraz daha yüksek gitmek için tercih ettik ve bunu ayarlamak, yüklü, https://github.com/allfro/pymiproxy de PyMiProxy üzerinde yakaladı indirdiğiniz, onların örnek kod aldı ve

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() 

Sonra onu ateş proxy.py bu yapılan

python proxy.py 

Sonraki kadar ben ... belirtilen proxy ile phantomjs yürütmek

phantomjs --ignore-ssl-errors=yes --cookies-file=cookies.txt --proxy=127.0.0.1:8080 --web-security=no myfile.js 
Şu tarihte ya da bu tür güvenliğinizi açmak isteyebilirsiniz

, ben olarak şu anda benim için gereksiz oldu Sadece bir kaynağı kazıyorum. Artık proxy konsolunuzdan akan bir sürü metin görmeli ve eğer "text/x-virgülle ayrılmış değerler" mime türüyle bir şeye inerse, onu data.csv olarak kaydedecektir. Bu aynı zamanda tüm başlıkları ve her şeyi kaydedecektir, ama eğer bu kadar ileri giderseniz bunları nasıl çıkaracağınızı anlayabilirsiniz.

Bir başka ayrıntıda, gzip kodlamasını devre dışı bırakmam gerektiğini, zlib kullanabileceğimi ve kendi apache web sunucusundan gzip dosyasındaki verileri açabileceğimi buldum, ancak IIS'den geliyorsa veya böyle bir dekompresyon gerçekleşirse hatalar ve bu bölüm hakkında emin değilim.

Bu yüzden güç şirketim bana bir API sunmuyor mu? İnce! Bunu zor yoldan yapıyoruz!

+0

Mükemmel fikir! – NiKo

+0

Bu Xedecimal için teşekkürler. – iwek

16

Bu sorun, son birkaç gündür yolumda olmuştur. Vekil çözümü çevremde çok temiz değildi, bu yüzden phantomjs'in QTNetworking çekirdeğinin kaynakları önbelleğe aldığında bulduğunu öğrendim.

Uzun lafın kısası, işte benim izim. Eğer phantomjs çağırdığınızda sadece önbellek etkin olduğundan emin olun Sonra 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 --disk-cache = gerçek test Sen cache.js ve mimetype.js dosyalar gerekir.js

Bazı notlar: Bazıları proxy kullanmadan veya düşük çözünürlüklü bir fotoğraf çekmeden, görüntüleri bir sayfada alma amacıyla yazdım. QT, belirli metin dosyası kaynaklarında sıkıştırmayı kullanır ve bunu metin dosyaları için kullanırsanız, dekompresyon ile uğraşmanız gerekir. Ayrıca, html kaynaklarını çekmek için hızlı bir test yaptım ve sonuçta http başlıklarını ayrıştırmadı. Ama bu benim için yararlıdır, umarım bir başkası bunu bulacaktır, belirli bir içerik türünde sorun yaşarsanız değiştirin.

+1

Nasıl açıldınız? – KJW

+0

gerçekten nasıl sıkıştırıldığını bulmak ister. Yönettin mi? –

+0

Siz efendim, bir asker. Bunun için teşekkürler. –