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-------------------------------------