• 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&mid=w-17007221856-0&wid=17007221856&path=%2Fsearch.htm&search=y&csy=1&pv=20608:76856228").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 = {
                 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-------------------------------------

  • 相关阅读:
    IE9以下程序开发不兼容项目罗列
    Flutter编程:Flutter命令行的学习
    Git merge 和 rebase 进一步比较
    Git merge rebase cherry-pick 以及 游离commit 的测试
    C++指针传递和引用传递的区别 (转载整理)
    git 填坑之 git 暂存区忽略文件
    小众软件:Windows 下优化软件推荐—— Dism++ | 强迫症晚期患者福音
    pip 安装库的时候使用豆瓣镜像 提升效率
    gitignore 忽略某文件夹下 非某后缀名的文件
    小众软件:画简洁风格的原型图
  • 原文地址:https://www.cnblogs.com/lichunjing/p/8301842.html
Copyright © 2020-2023  润新知