【问题标题】:Download resource image files using casperjs使用 casperjs 下载资源图像文件
【发布时间】:2017-08-01 08:57:17
【问题描述】:

我阅读了文档,看起来您需要有 slimerjs http://docs.casperjs.org/en/latest/events-filters.html 才能从 page.resource.received 事件中获取 responseData.body

我的用例是在页面加载时下载图像,所以我不会再做一次往返:获取资源 JSON,下载并保存任何图像文件,重新加载文件以检查图像尺寸,如果太小(图标)-> 消除。

我想知道是否有更好的方法来做到这一点。我实际上可以去做evaluate img 选择器,但有些网站使用background-url css,这很棘手。

【问题讨论】:

    标签: javascript node.js phantomjs casperjs slimerjs


    【解决方案1】:

    评估可能很棘手,但这是一种可能的方法:(仅限 PhantomJS

    这个例子有可能

    1. 存储符合特定条件的图像的clipRects 将这些元素的后page.render() 放入屏幕截图文件中。

    2. 存储匹配资源的 url 以供后续下载 请求

    3. 在 'src' 属性或 'background-image' 中捕获 url css 属性,同时尝试获取用于标准匹配和捕获目的的宽度和高度。

    var page = require('webpage').create();
    page.onConsoleMessage = function(msg) {console.log(msg);};
    console.log('[#] I M A G E · N I N J A');
    page.open('http://cartawifi.com', function(status) {
      var clipRectList = page.evaluate(function(pagex) {
        // .: Captured Images : In-Memory Reference Storage :.
        const IMAGES = {
            'src':{'indxs':[],'ref':[]},
            'background-image':{'indxs':[],'ref':[]},
            'selectors':[]
        }; 
        var clipRects = []; // maybe you want to take page screenshots of specific elements containing matching images
        var capturedImages = 0; var totalElements = 0;
        // .: Define Image Capture : Min/Max Width/Height :.
        const minWidth = 1; const minHeight = 1;
        const maxWidth = 9999;  const maxHeight = 9999;
        const regxp = new RegExp('url');
        $('*').each(function(index, el) { var ignore=false;
            // search for elements with 'background-image' css property
            if($(el).css('background-image')!=null!=null){
                var wu = $(this).css('width');
                var width = parseFloat(wu.replace('px',''));
                var hu = $(this).css('height');
                var height = parseFloat(wu.replace('px',''));
                var src = $(el).css('background-image');
                var group = "background-image"
                if(!src.match(regxp)){ignore=true;}else{
                    //remove the keep the contents inside the 'url()' string'
                    src = (($(el).css('background-image')).slice(4));
                    src = src.substring(0, src.length - 1);
                }
            }
            // search for elements with 'src' html attribute
            else if($(el).attr('src')!=null){
                var width = $(this).get(0).naturalWidth; 
                var height = $(this).get(0).naturalHeight;
                var group = "src" 
                var src = $(el).attr('src');
            }
            //---------------------------------------------------------
            if(width>=minWidth&&height>=minWidth&&
               width<=maxWidth&&height<=maxWidth&&
               !ignore){
                    IMAGES[group].indxs.push(index); 
                    IMAGES[group].ref.push(src); 
                    IMAGES.selectors.push(this); 
                    capturedImages++;
                    console.log("  [captured] :",group,width,height,src);
                    //:store clipRect for this element
                    var clipR = $.extend({},$(el).offset(),{width: $(el).offsetWidth,height: $(el).offsetHeight});
                    console.log("    (clipRect)",JSON.stringify(clipR));
                    clipRects.push(clipR);
            }
            totalElements++;
        });
        // report information :
        console.log('[i] Total Elements Parsed : ',totalElements);
        console.log('[*] Total Images Captured : ',capturedImages);
        console.log('     >              [src] : ',IMAGES['src'].indxs.length);
        console.log('     > [background-image] : ',IMAGES['background-image'].indxs.length);
      });
      console.log('[!] TO-DO : STORE CAPTURED IMAGES AS FILES');
      phantom.exit();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多