nodejs PhantomJS 抓取数据

node 抓取数据-------一年以前学习的版本------------start--------------

lelet cheerio = require('cheerio')
        let urlLib = require("url");
        const gbk=require("gbk");
        get("https://chunmu-jia.jiyoujia.com/search.htm?spm=a1z10.3-c-s.w4002-17007221856.4.4fe9ad25hb7peu&_ksTS=1512987361656_194&callback=jsonp195&m).then((b) => {
            console.log("77777777")
            var $ = cheerio.load(gbk.toString('utf-8',b));
            $(".photo").each(function(i, elem) {
                console.log($(this).find("img").attr("src"));
            });
        }, (err) => {
            console.log("888888888")
            console.log(err);
        });

        function get(url) {
            return new Promise((resolve, reject) => {
                _get(url)
                function _get(url1) {
                    var mod = null;
                    var res = urlLib.parse(url1);
                    if (res.protocol == "http") {
                        mod = require("http");
                    } else {
                        mod = require("https");
                    }
                    const req = mod.request({
                        host: res.host,
                        path: res.path,
                        port: res.port
                    }, (res) => {
                        console.log(res.statusCode )
                        if (res.statusCode >= 200 && res.statusCode < 300) {//表示获取的网页是成功的
                            var arr = [];
                            res.on("data", (data) => {
                                arr.push(data);
                            });

                            res.on("end", () => {
                                var b = Buffer.concat(arr);
                                resolve(b);
                            });
                        } else {//状态吗表示为成功
                            if (res.statusCode == 301 || res.statusCode == 302) {//表示网页诶重定向了 可以根据几次定向找到
                                _get(res.headers.location)
                            } else {
                                console.log(res.headers)
                                reject(res.statusCode);
                            }
                        }
                    });

                    req.on("error", (err) => {
                        console.log("出错了" + err);
                    });

                    req.end();
                }
            });
        }

  

不能实现的地方:动态添加的数据获取不到

-------------------------end-------------------------------------

---------------PhantomJS 抓取数据------------------start-----------------------------

PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。

PhantomJS官方地址:http://phantomjs.org/。

PhantomJS安装:

1.去PhantomJS下载对应的版本

2.设置环境变量PATH(sudo ln -s /Applications/phantomjs-2.1.1/bin/phantomjs /usr/local/bin/)windows找自己设置的方法,2.1.1是自己的版本

PhantomJS验证成功:在终端数据phantomjs

运行:phantomjs get_data.js http://www/taobao.com

在page.evaluate根据页面结构找到对应的数据 抛出

//访问 phantomjs XXX.js 需要抓取的页面url
        //创建一个webpage对象
        var page = require('webpage').create();
        //拿到页面url
        var system = require('system');
        //设置打开页面的大小 尽量大,有些图片都是懒加载
        page.viewportSize = {
            width: 2000,
            height: 40000
        };
        //用phantomjs浏览器加载一个网页
        page.open(system.args[1], function (status) {
            // 输出状态
            if (status !== 'success') {
                console.log("加载失败")
                //页面加载成功
            } else {
                //给一定的异步时间防止那些后加载的东西
                setTimeout(function () {
                    //加载jquery
                    page.includeJs("https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js", function () {
                        //page.evaluate 方法内也可以执行页面js 在里面组装数据
                        var data = page.evaluate(function (s) {
                            var arr = [];
                            for (var i = 0; i < $(".J_MouserOnverReq").length; i++) {
                                var obj = {};
                                obj.href = $(".J_MouserOnverReq:eq(" + i + ")").find(".pic-link").attr("data-href");
                                obj.price = $.trim($(".J_MouserOnverReq:eq(" + i + ")").find(".g_price").text());
                                obj.title = $.trim($(".J_MouserOnverReq:eq(" + i + ")").find(".J_ClickStat").text());
                                obj.image = $(".J_MouserOnverReq:eq(" + i + ")").find(".J_ItemPic").attr("src");
                                arr.push(obj);
                            }
                            return arr;
                        });
                        console.log(JSON.stringify(data))
                        //把从页面拿到的数据传给自己的接口去处理数据
                        page.open('http://localhost:8080/data/data/sku_stock', 'POST', "data=" + data, function (status) {
                            console.log('去ares-chart处理数据了');
                        });
                    });
                }, 5000);
            }
        });

-------------------------end-------------------------------------