2012-07-17 18 views
19

में संसाधन सामग्री को पकड़ें मुझे लगता है कि कैस्परजेएस में "डाउनलोड" फ़ंक्शन और "संसाधन प्राप्त" कॉलबैक है लेकिन मुझे कॉलबैक में संसाधन की सामग्री दिखाई नहीं दे रही है, और मैं नहीं चाहता फाइल सिस्टम को संसाधन डाउनलोड करें।CasperJS या PhantomJS

मैं संसाधन की सामग्री को पकड़ना चाहता हूं ताकि मैं अपनी स्क्रिप्ट में इसके साथ कुछ कर सकूं। क्या यह कैस्परजेएस या फैंटॉमजेएस के साथ संभव है?

उत्तर

2

पता ही नहीं था मैं इस तरह दस्तावेज़ ऑब्जेक्ट से स्रोत हड़पने सकता है:

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

अधिक जानकारी here

1

आप Casper.debugHTML() उपयोग कर सकते हैं एक HTML संसाधन की सामग्री को प्रिंट करने की: casper.getPageContent() का उपयोग कर

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

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

casper.run(); 

तुम भी एक वर में HTML सामग्री स्टोर कर सकते हैं: http://casperjs.org/api.html#casper.getPageContent (उपलब्ध नवीनतम मास्टर में)

+1

धन्यवाद निको, और मुझे लगता है कि मैं स्पष्ट नहीं था, लेकिन मैं अन्य सभी संसाधनों की तलाश में हूं, न कि HTML पृष्ठ। मैं बाहरी सीएसएस या जेएस फ़ाइल को एक var में संग्रहीत करना चाहता हूं, इन संसाधनों की सामग्री, क्या यह संभव है? – iwek

+0

बस सुनिश्चित करें कि आपने प्रोटोकॉल को सही (यानी http बनाम https) सेट किया है .. मुझे उस साइट को समझने में थोड़ी देर लग गई थी जिसे मैं खोलने की कोशिश कर रहा था http से https तक रीडायरेक्ट कर रहा था .. और वह दबा हुआ कैस्परजेस (बग?) – abbood

+0

@ iwek इस लिंक को डिस्क पर संसाधन को सहेजने के बारे में और जानने के लिए देखें: http://stackoverflow.com/questions/24582307/how-to-save-the-current-webpage-with-casperjs-phantomjs जैसा कि http द्वारा उत्तर दिया गया है: //stackoverflow.com/users/1816580/artjom-b – iChux

16

मैं हमने पाया है कि जब तक phantomjs थोड़ा परिपक्व नहीं हो जाता है, इस मुद्दे के अनुसार 158 http://code.google.com/p/phantomjs/issues/detail?id=158 यह उनके लिए सिरदर्द का थोड़ा सा है।

तो क्या आप इसे वैसे भी करना चाहते हैं? मैं यह पूरा करने के एक सा उच्च जाने के लिए निकल चुके हैं और PyMiProxy, https://github.com/allfro/pymiproxy पर अधिक पकड़ लिया है डाउनलोड किया है, स्थापित है, इसे सेट अप, उनके उदाहरण कोड लिया और

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

तो मैं यह आग proxy.py में बनाया ऊपर

python proxy.py 

अगला मैं प्रॉक्सी निर्दिष्ट साथ phantomjs पर अमल ...

phantomjs --ignore-ssl-errors=yes --cookies-file=cookies.txt --proxy=127.0.0.1:8080 --web-security=no myfile.js 

आप पर या फिर अपने सुरक्षा चालू करने के लिए चाहते हो सकता है, यह वर्तमान में मेरे लिए अनावश्यक मैं के रूप में था मी सिर्फ एक स्रोत scraping। अब आपको अपने प्रॉक्सी कंसोल के माध्यम से बहने वाले पाठ का एक गुच्छा देखना चाहिए और यदि यह "टेक्स्ट/एक्स-कॉमा-सेपर-वैल्यू" के माइम प्रकार के साथ कुछ पर उतरता है तो यह इसे data.csv के रूप में सहेज लेगा। यह सभी शीर्षकों और सब कुछ को भी बचाएगा, लेकिन यदि आप अभी तक आ चुके हैं तो मुझे यकीन है कि आप यह समझ सकते हैं कि उन्हें कैसे पॉप अप करना है।

एक अन्य विवरण, मैंने पाया है कि मुझे gzip एन्कोडिंग को अक्षम करना पड़ा है, मैं अपने स्वयं के अपाचे वेबसर्वर से gzip में डेटा को डीएलआईपी और डिकंप्रेस कर सकता हूं, लेकिन यदि यह आईआईएस से बाहर आता है या ऐसा डिकंप्रेशन मिल जाएगा त्रुटियां और मैं इसके उस हिस्से के बारे में निश्चित नहीं हूं।

तो मेरी पावर कंपनी मुझे एक एपीआई नहीं देगी? ठीक! हम इसे कठिन तरीका करते हैं!

+0

उत्कृष्ट विचार! – NiKo

+0

इस Xedecimal के लिए धन्यवाद। – iwek

16

यह समस्या पिछले कुछ दिनों से मेरे रास्ते में रही है। प्रॉक्सी समाधान मेरे पर्यावरण में बहुत साफ नहीं था, इसलिए मुझे पता चला कि फैंटोमज के क्यूटीनेटवर्किंग कोर ने संसाधनों को कब रखा था जब उन्हें कैश किया गया था।

लंबी कहानी छोटी, यहां मेरी जिंदगी है। आप 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 --डिस्क-संचय = असली परीक्षा।जेएस

कुछ नोट्स: मैंने प्रॉक्सी का उपयोग किए बिना छवियों को प्राप्त करने या कम रेज स्नैपशॉट लेने के उद्देश्य से इसे लिखा है। क्यूटी कुछ पाठ फ़ाइल संसाधनों पर संपीड़न का उपयोग करता है और यदि आप पाठ फ़ाइलों के लिए इसका उपयोग करते हैं तो आपको डिकंप्रेशन से निपटना होगा। इसके अलावा, मैंने एचटीएमएल संसाधनों को खींचने के लिए एक त्वरित परीक्षण चलाया और परिणामस्वरूप से http हेडर को पार्स नहीं किया। लेकिन, यह मेरे लिए उपयोगी है, उम्मीद है कि किसी और को यह मिल जाएगा, अगर आपको किसी विशिष्ट सामग्री प्रकार में समस्याएं हैं तो इसे संशोधित करें।

+1

आप कैसे डंप्रेस करते हैं? – KJW

+0

वास्तव में यह जानना चाहेंगे कि आप कैसे डंप्रेस किए गए हैं। क्या आपने इसे प्रबंधित किया? –

+0

आप महोदय, एक सैनिक हैं। इसके लिए धन्यवाद। –

संबंधित मुद्दे