• PhantomJs 与 Casperjs


    利用PhantomJS做网页截图经济适用,但其API较少,做其他功能就比较吃力了。

    CasperJs是对phantomjs的一次封装。即phantomjs是原生的,而casperjs是封装在以phantomjs基础上的玩意。

    用CasperJS浏览页面比用PhantomJS更加方便和直观。

    相关传送门:

    # 官网
    http://casperjs.org/

    # github
    https://github.com/casperjs/casperjs

    # 快速入门
    http://docs.casperjs.org/en/latest/quickstart.html

    # API文档
    http://docs.casperjs.org/en/latest/modules/index.html

    # Event事件API文档
    http://docs.casperjs.org/en/latest/events-filters.html#events-reference
    # 利用phantomjs+casperjs实现登陆抓取网页并截图
    http://blog.csdn.net/longhaoyou/article/details/43524977

    # 入门练习demo
    http://blog.csdn.net/kiwi_coder/article/details/36248353

    # 利用nodejs+phantomjs+casperjs采集淘宝商品的价格
    http://www.cnblogs.com/xinzhyu/p/4214669.html

    # 萌萌CasperJS第1篇 1分钟写完爬虫 拿亚马逊商品数据
    http://blog.csdn.net/sagomilk/article/details/20800543

    # 解决乱码问题:

    phantom.outputEncoding = "gbk";

    # 利用open / AJAX发送HTTP请求

    http://docs.casperjs.org/en/latest/modules/casper.html#open

    http://docs.casperjs.org/en/latest/modules/clientutils.html#sendajax

    # 监听页面的错误

    phantom.outputEncoding = "gbk";
    var casper = require('casper').create({
        viewportSize: { 414, height: 736},
        waitTimeout:50000
    });
    
    // 需要先申明,然后再start
    casper.on('page.error', function (err) {
            this.echo(err)
    })
    
    casper.start('http://localhost:8081/#/home', function () {
        this.echo('Casper Starting');
    })
    
    casper.run();

    # 快速判断元素是否存在

    var casper = require('casper').create();
    
    casper.start('http://domain.tld/page.html', function() {
        if (this.exists('h1.page-title')) {
            this.echo('the heading exists');
        }
    });
    
    casper.run();

    # 建议对click之后的验证加入wait操作。这样可以有更好的保证. 并且建议尽可能使用thenClick。除非点击的元素要在指定的区域

      // houseBusinessDetails
        this.thenClick('.listviewItem:nth-child(1) .busitem').wait(1500, function () {
            this.echo(this.getCurrentUrl());
            this.capture('capture/houseBusinessDetails.png')
        })

    # 可以用thenOpen进行跳转界面

      // carBusiness
        this.thenOpen('http://localhost:8081/#/carBusiness').waitForSelector('.listviewItem').wait(300, function () {
            this.echo(this.getCurrentUrl());
            this.capture('capture/carBusiness.png')
        })

    个人练手笔记

    phantom.outputEncoding = "gbk";
    var casper = require('casper').create({
        viewportSize: { 414, height: 736},
        waitTimeout:30000,
    });
    
    const u = function () {
        casper.echo("当前正在操作的URL为:" + casper.getCurrentUrl())
    }
    
    // 需要先申明,然后再start
    casper.on('page.error', function (err) {
         this.echo("出现了error等级的错误信息------- " +  err, 1);
    })
    
    casper.start('http://localhost:8081/', function () {
        // Home
        this.waitForSelector("#app .centers-sec", function () {
            u()
            this.capture('capture/home.png')
        })
    
        // houseBusiness
        this.thenClick('.module:nth-child(1)').wait(1500, function () {
            u()
            this.capture('capture/houseBusiness.png')
        })
    
        // houseBusinessDetails
        this.thenClick('.listviewItem:nth-child(1) .busitem').wait(1500, function () {
            u()
            this.capture('capture/houseBusinessDetails.png')
        })
    
        // carBusiness
        this.thenOpen('http://localhost:8081/#/carBusiness').waitForSelector('.listviewItem').wait(1500, function () {
            u()
            this.capture('capture/carBusiness.png')
        })
    
        // CarBusinessDetails
        this.thenClick('.listviewItem:nth-child(1) .busitem').wait(1500, function () {
            u()
            this.capture('capture/CarBusinessDetails.png')
        })
    
        // lentOutDetail
        this.then(function () {
            if (this.exists('#header .right-btn a')) {
                this.thenClick('#header .right-btn a').wait(1500, function () {
                    u()
                    this.capture('capture/lentOutDetail.png')
                })
            }
        })
    
        // myBusiness
        this.thenOpen('http://localhost:8081/#/myBusiness').wait(1500, function () {
            u()
            this.capture('capture/myBusiness0.png')
        }).thenClick(".mint-tab-item:nth-child(2)").wait(2500, function () {
            u()
            this.capture('capture/myBusiness1.png')
        }).thenClick(".mint-tab-item:nth-child(3)").wait(1000, function () {
            u()
            this.capture('capture/myBusiness2.png')
        })
    
        // userInfo
        this.thenOpen('http://localhost:8081/#/user/userInfo').wait(1500, function () {
            u()
            this.capture('capture/userInfo.png')
        })
    
        // qrcode
        this.thenOpen('http://localhost:8081/#/qrcode').wait(1500, function () {
            u()
            this.capture('capture/qrcode.png')
        })
    
        // allLedger
        this.thenOpen('http://localhost:8081/#/allLedger').wait(3500, function () {
            u()
            this.capture('capture/allLedger.png')
        })
    
        // AutoRepay
        this.thenOpen('http://localhost:8081/#/AutoRepay').wait(3500, function () {
            u()
            this.capture('capture/AutoRepay.png')
        })
    
        // auditAssign
        this.thenOpen('http://localhost:8081/#/auditAssign').wait(2500, function () {
            u()
            this.capture('capture/auditAssign.png')
        })
    })
    
    casper.run();
    View Code
  • 相关阅读:
    ForeignKey 的第二个位置参数on_delete
    我们为什么要用springcloud?
    使用springcloud zuul构建接口网关
    分布式环境 限流解决方案
    Spring Cloud限流思路及解决方案
    SpringBoot初始教程之Redis集中式Session管理
    分布式高并发下全局ID生成策略
    分布式日志收集收集系统:Flume(转)
    深入理解Java类加载器(ClassLoader) (转)
    各类排序算法复杂度比较
  • 原文地址:https://www.cnblogs.com/CyLee/p/7309381.html
Copyright © 2020-2023  润新知