叮铃铃!叮铃铃!老师:“小明 你的梦想是什么?”, 沉思了一下 小明:“额额 我想有车有房,自己当老板,媳妇貌美如花,还有一个当官的兄弟” 老师:“北宋有一个人和你一样···”;
哈喽!大家好! 请叫我布莱恩·奥复托·杰森张;
一提到爬虫,好多人先想到python 没错就是那个py交易的那个,这货所为是什么都能干 上九天揽月下五洋捉鳖无处不出现它的身影 鄙人对它也是不得不折服,在爬虫这货缺点在于编码格式上还有那些DOM操作他就不是那么得心应手,so 这家伙 就是nodejs依赖着对于前端的粘合性,这货做扒手也是一绝啊!咱们先三八一下它 虽然本人学的也是懵懵懂懂,但是咱毕竟靠吹牛逼起家,就告诉你们我就是吹牛逼,你们看看它爆不爆! 嘿嘿嘿
爬虫大本分是为了获取网络数据,哎 又爱说废话 直接上代码了
var cheerio = require('cheerio'); 这个东西呢 可以简单理解为Nodejs里面的JQuery。它包括了 jQuery 核心的子集,Cheerio 从jQuery库中去除了所有 DOM不一致性和浏览器尴尬的部分,揭示了它真正优雅的API。
var superagent = require('superagent'); 这东西简单理解为Node里面的Ajax。superagent 是一个轻量的,渐进式的ajax api,可读性好,学习曲线低,内部依赖nodejs原生的请求api,适用于nodejs环境下。
var http = require('http'); Node自带http服务框架;
东西备的差不多了,这个意思大家应该清楚,就是node模拟浏览器发送 ajax在信息中心提取自己想要的东西;介于一般成熟性网站都会做的很是讲究,所以你查找元素也是很简便嘛,一下为部分代码,希望大家理解意思就好,毕竟代码还要自己写,复制黏贴错都找不到!
superagent.get(links).end(function (err, sres) {
// 常规的错误处理
if (err) {
return next(err);
}
// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
// 剩下就都是 jquery 的内容了
var $ = cheerio.load(sres.text);
ans += $(".channel").text() +' 宝贝名称:
';
$('#J_Title').each(function (index, item) {
var $item = $(item);
ans += $item.find(".tb-main-title").text() + '
';
});
ans += "链接"+links;
res.send(ans);
// 将内容呈现到页面
});
这样我们把想要的信息发送到了调用接口的页面; 如果不想这样 我还要复制太麻烦 我想直接要文件,搜嘎 那就要用这个东东 文件流的读写;
/*var data = '';
// 创建可读流
var readerStream = fs.createReadStream('output.txt');
// 设置编码为 utf8。
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
data += chunk;
});
readerStream.on('end',function(){
// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');
// 使用 utf8 编码写入数据
writerStream.write(data+ans+'\r\n','UTF8');
// 标记文件末尾
writerStream.end();
});
readerStream.on('error', function(err){
console.log(err.stack);
});*/
这里要注意的一点是由于node异步i/o操作,你所执行的事件如果存在先后依赖关系,后面事件要写到回调函数里面;如果我们直接写入那么文件只剩下最后一条,他会把之前数据清空;我这里采用的写入方法是先读取再写入的方法,我也在找有没有啥方法直接续写的 可是没找到··· 不知道大神门都是怎么写滴ha
说完爬取数据再说访问量的事情就简单啊 我只要模拟浏览器请求页面就可了,鉴于每个网站技术不一样 检测方式也是各种各样 用session啊 用ip啊 用浏览器信息啊 再组合起来 方法无穷,就看人家写网站的把访客量当一回事不了(就好比我之前写的一个东东,请求一个接口就加一个,你刷新页面就ok了嘛 );
拿csdn来说 显然人家没有当回事,so 我这级别都有机可乘,咱们就是图个乐呵,哎 心里高兴 没办法 你咬我啊!
这次 用 http模块就可以了;
var options = {
url: baseUrl,
method: 'GET',
charset: "utf-8",
headers:{
'Accept':'application/json, text/javascript, */*; q=0.01',
'Content-Type':'text/plain/application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With':'XMLHttpRequest',
'Set-Cookie': 'ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH',
'Cookie':'imooc_uuid=fe4eb00a-b08b-4442-a87d-c077f0fa94dc; imooc_isnew_ct=1482112514; loginstate=1; apsid=I3ODRkMzRiY2MzNjZkZDlkNzZkZDk3OGYwNGFkYTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAyNjA1OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMjE0NDgzNjM5QHFxLmNvbQAAAAAAAAAAAAAAAAAAADhjOTM3MTEyMTVkZDJkODBiZGQ5MGZhYjUxZDk2YTNkADZbWAA2W1g%3DYj; last_login_username=1214483639%40qq.com; PHPSESSID=dlq6ctudtje87erfq523b0dak7; jwplayer.volume=71; IMCDNS=0; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1482112514,1482372528,1482377953,1482457056; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1482460689; imooc_isnew=2; cvde=585c7fe052b01-26',
'Server':' Microsoft-IIS/5.0',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'
}
//rejectUnauthorized: false //在请求的时候指定忽略证书验证,即options的rejectUnauthorized参数设置为false
};
var a = parseInt(2000 * Math.random() + 1000);
setInterval(function() {
var ans = "";
a = parseInt(2000 * Math.random() + 200);
http.get(baseUrl, function(response) {
var body = [];
//console.log(response.headers); //header
response.on('data', function(chunk) {
body.push(chunk);
//console.log(chunk); //buffer
});
response.on('end', function() {
body = Buffer.concat(body);
var $ = cheerio.load(body.toString());
ans += $(".article_title").find('a').text();
ans += $(".link_view").text();
console.log('博客标题:'+ans + '--调用间隔时间:' + a + '\r\n');
});
});
}, a);
我之前试过更换ip进行测试 结果 不是用ip检测 这里的意思已经很是明确了吧。在它这种简单判断下,我们模拟浏览器进行访问 对于它需要校验你是不是刚刚访问过的数据是对不上的 我们每次请求新数据值都为空 进行判断一定是不等于 这样它把我们每次都当成一个新访问来处理;
这里值得一提的就是如果地址为网站为https时 需要加载 https模块 http是会报错的,在没有证书的情况下 请求的时候指定忽略证书验证,即options的rejectUnauthorized参数设置为false;这样就可以了; 啥? https模块不会下载? npm install *** 就ok啦
需要后面加 -g的是gulp grunt 还有supervisor 这种东西 其他的只要在自己项目里面加载就好 还有grunt自动化下载配置一下全都搞定
"dependencies": {
"grunt-contrib-stylus": "^1.0.0",
"util": "*" },
想要指定版本就制定 不要就是* 默认最新;Global(阁楼包-全局);来 尽情赞美我吧 ;
同事用java写了一个自动发消息的小程序,我一看心中甚欢,那我就用node搞一搞吧,这就发现了这个node神器,国内网站穷的连个文档都难找 所以我就在这里给大家发一下;
Node.js桌面自动化。控制鼠标,键盘,读取屏幕。RobotJS支持Mac,Windows和Linux。没啥多说的;(写的我口干舌燥,都不知道晚上吃啥了);
npm install robotjs 没毛病,再说怎么安装都要呕吐了;
鼠标事件 - 写个程序让鼠标满屏幕自己跑 好不好撒;(不会直接拿代码玩);
var robot = require("robotjs");
robot.setMouseDelay(2);
var twoPI = Math.PI * 2.0;
var screenSize = robot.getScreenSize();
var height = (screenSize.height / 2) - 10;
var width = screenSize.width;
for (var x = 0; x < width; x++)
{
y = height * Math.sin((twoPI * x) / width) + height;
robot.moveMouse(x, y);
}
键盘事件 -- 比较有意思就是自己写东西;
var robot = require("robotjs");
robot.typeString("Hello World");
robot.keyTap("enter");
自己写东西 再自己回车 那你想一想你把程序跑起来;把鼠标往qq 微信里面一放 嘿嘿
微信就把你屏蔽掉;发送消息过于频繁。。。 so 来个定时器就妥活了;
屏幕事件 -- 这个个人Jude比较无聊 做个吸色器还可以;
var robot = require("robotjs");
var mouse = robot.getMousePos();
var hex = robot.getPixelColor(mouse.x, mouse.y);
console.log("#" + hex + " at x:" + mouse.x + " y:" + mouse.y);
吸取鼠标位置 屏幕颜色;
这个框架 方法还有好多 譬如 robot.mouseClick(); 左击事件 你把鼠标放到哪里让他一直点击·· 有点神经病一样;但是在程序里面配合起来,你会发现 我的天啊(此处想用哪个奥运表情包);
哎 写的鄙人手疼 不知你可知我心;话说回来 为啥没图呢; 好多地方应该有图, 此时因为搞了一个软件把鄙人电脑ip搞乱了;扣扣登录不上去,自然没法截图;
手疼了 不说了 说多了都是眼泪 ;
在北京有些人总是问你们北方人怎么这么怕冷 再次解释一下: 北方的干冷是无力攻击,多穿衣服就可轻松防御;南方湿冷是没法攻击,穿再多衣服都没用,得要抗性!置于 北京 那是中间地带 要双抗;快来复活甲啊@!@;