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、HTML五、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-------------------------------------javascript

相關文章
相關標籤/搜索