zoukankan      html  css  js  c++  java
  • 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-------------------------------------

  • 相关阅读:
    DataAnnotations
    使用BizTalk实现RosettaNet B2B So Easy
    biztalk rosettanet 自定义 pip code
    Debatching(Splitting) XML Message in Orchestration using DefaultPipeline
    Modifying namespace in XML document programmatically
    IIS各个版本中你需要知道的那些事儿
    关于IHttpModule的相关知识总结
    开发设计的一些思想总结
    《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
    《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)
  • 原文地址:https://www.cnblogs.com/lichunjing/p/8301842.html
Copyright © 2011-2022 走看看