nodejs爬取图片虫只能爬取部分数据,好急,求助

NodeJS爬虫系统
视频太卡?试试切换线路
本课时介绍一下 NODEJS 爬宠系统课程概要。
本课时介绍爬虫系统以及 Robots 协议,爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,robots.txt 是一个协议,不是一个命令。robots.txt 是爬虫要查看的第一个文件。robots.txt 文件告诉爬虫在服务器上什么文件是可以被查看的。
本课时介绍配置爬虫系统和开发环境,因为我们是基于 Nodejs 进行开发,所以我们需要从npm 上对 Express、Request、Cheerio 安装并使用。
本课时学习 NODEJS 爬虫系统的代码实战,我们利用 Express 搭建 Server、利用 Request 发起网络请求、利用 Cheerio 可以像 JQuery 一样操作 Request 取到的网络 HTML 数据。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [NODEJS爬虫系统课程概要]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [NODEJS爬虫系统课程概要]
服务热线:400-678-8266NodeJs(2)
没有那么难的,嘿嘿,说起来呢其实挺简单的,只需要将自己的数据加载到程序里再进行解析就可以了,如果说你的Qzone是向所有人开放的,那么就有一个JSONP的接口,这么说来就简单了,也就不用我们再利用phantomjs,缓慢的爬了。其实程序还没有做的太过完美,只是简单地可以打印出来说说的内容,明天再做一下,把说说存到数据库里,嘿嘿。
做这个呢,需要用到一个开源库,nodegrass,是对nodejs里的http.request的封装。
先看这个代码吧,明天再完善,其实基本原型就在这里了,所需要的已经在代码里了。当然了里边的那个链接是我自己的JSONP的接口,如果你懂的话,你会知道怎么改成你的JSONP接口,但是需要说的是必须空间对所有人开放。
var nodegrass = require('nodegrass');
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('blog.db');
var tmp = 0;
function nodepa(tmp) {
if (tmp == 10) tmp--;
nodegrass.get(&/cgi-bin/emotion_cgi_homepage_msg?owneruin=&start=& + tmp + &&num=10&format=jsonp&, function(data, status, headers) {
var json = JSON.parse(data.slice(10, -2));
for (var s in json['result']['posts']) {
db.run(&insert into qzone values('& + (Number(s) + tmp).toString() + &','& + json['result']['posts'][s]['content'].toString() + &','& + json['result']['posts'][s]['create_time'].toString() + &','& + json['result']['posts'][s]['createTime2'].toString() + &')&, function() {
if (this.changes == undefined || this.changes == null)console.log(&err&);
console.log(json['result']['posts'][s]['content']);
console.log(json['result']['posts'][s]['createTime2']);
console.log(Number(s) + tmp);
if (tmp & 2640) nodepa(tmp + 10);
}, 'utf-8').on('error', function(e) {
console.log(&Got error: & + e.message);
nodepa(tmp);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场1452人阅读
nodejs(2)
Nodejs爬虫(定时爬取)
Node.js是一个Javascript运行环境(runtime)。实际上它是对Google
V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js使用,
非阻塞&模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
l&使用NodeJs写网页爬虫的优势
大家都知道,我们要写一个网页爬虫,爬取网页上的信息,实际上就是将目标网站的页面html下载下来,然后通过各种方式(如正则表达式)获取我们想要的信息并保存起来。从这点看来,使用Nodejs来写网页爬虫便有着相当大的优势。
n&Nodejs采用了Javascript的语法规则,是前端开发人员能够很容易上手
n&Nodejs写爬虫可以避免写一大堆正则表达式去匹配元素,我们可以用jquery的语法直接获取dom对象,方便快捷,可读性强。
n&Nodejs解决了Javascript无法直接操作系统文件的短板,让我们可以轻松操作系统中文件。
l&NodeJs写网页爬虫需要准备的环境
1.首先,如果你的电脑没有安装nodejs,那么,你需要到nodejs的官网中下载一个nodejs安装包并安装(安装过程跟普通程序无异,这里就不再赘述)。
Nodejs的官方网址为:
2.安装好NodeJs之后,我们就可以在我们的项目空间中创建我们的项目目录,并通过npm命令对项目进行初始化,并安装以下插件(具体安装过程不再赘述,大家可百度一下npm安装插件的方法)。
&bufferhelper&:&^0.2.1&,
&cheerio&:&^0.20.0&,
&http&:&^0.0.0&,
&https&:&^1.0.0&,
&iconv-lite&:&^0.4.13&,
&node-schedule&:&^1.1.1&,
&path&:&^0.12.7&,
&request&:&^2.74.0&,
&url&:&^0.11.0&
3.然后,我们可以全局安装一下express模块,命令如下:
npm install -g express-generator
cnpm install -g express-generator
4.安装好express模块之后呢,我们就可以通过express创建一个新的爬虫项目啦,具体命令如下:
express spider
命令执行完后我们就可以看到这样的一个项目啦:
项目构建好之后,我们还要为项目安装依赖,命令如下:
npm install
做完上面的步骤,我们的环境就算是搭建好了,接下来,我们就来看一下我们的爬虫系统涉及到了那些模块。
1)&文件系统(./module/File.js)
&* 常用文件操作模块
&* Created by 汤文辉 on .
var fs = require('fs'),//文件操作
&&&&mkdirp = require(&mkdirp&);//目录操作
function(options) {
&&&&this.path= options.path||
&&&&this.filename= options.filename||
&&&&this.encoding= options.encoding||
&* 修改文件内容并保存
&* @paramcontent &&文件内容
&* @parambAppend &&是否追加模式
&* @paramencoding &文件编码,默认为UTF-8
File.prototype.save=
function(content,bAppend,encoding)
&&&&varself =
&&&&varbuffer =
newBuffer(content,encoding || self.encoding);
&&&&vardoFs
&&&&&&&&fs.open(self.path+self.filename,bAppend
'w',&0666&,function
(err,fd) {
&&&&&&&&&&&&if(err) {
&&&&&&&&&&&&&&&&throwerr;
&&&&&&&&&&&&}
&&&&&&&&&&&&varcb2
&&&&&&&&&&&&&&&&if(err){
&&&&&&&&&&&&&&&&&&&&throwerr;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&fs.close(fd,function(err){
&&&&&&&&&&&&&&&&&&&&if(err){
&&&&&&&&&&&&&&&&&&&&&&&&throwerr;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&console.log('文件成功关闭...');
&&&&&&&&&&&&&&&&})
&&&&&&&&&&&&};
&&&&&&&&&&&&fs.write(fd,buffer,0,buffer.length,0,cb2);
&&&&&&&&});
&&&&fs.exists(self.path,function
(exists) {
&&&&&&&&if(!exists) {
&&&&&&&&&&&&self.mkdir(self.path,&0666&,function
&&&&&&&&&&&&&&&&doFs();
&&&&&&&&&&&&});
&&&&&&&&}else
&&&&&&&&&&&&doFs();
&* 递归创建目录
&* @parampath &&&&&目录路径
&* @parammode &&&&&模式 &默认使用 0666
&* @paramfn &&&&&&&回调
&* @paramprefix &&&父级菜单
File.prototype.mkdir=
function(path,mode,fn,prefix)
&&&&sPath = path.replace(/\\+/g,'/');
&&&&varaPath = sPath.split('/');
&&&&prefix = prefix ||'';
&&&&varsPath = prefix + aPath.shift();
&&&&varself =
&&&&&&&&fs.mkdir(sPath,mode,function
&&&&&&&&&&&&if((!err) || ( ([47,-4075]).indexOf(err[&errno&])
& -1 )) {//创建成功或者目录已存在
&&&&&&&&&&&&&&&&if(aPath.length&
&&&&&&&&&&&&&&&&&&&&self.mkdir(aPath.join('/'),mode,fn,sPath.replace(/\/$/,'')
+'/');
&&&&&&&&&&&&&&&&}else
&&&&&&&&&&&&&&&&&&&&fn();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&} else{
&&&&&&&&&&&&&&&&console.log(err);
&&&&&&&&&&&&&&&&console.log('创建目录:'+
sPath + '失败');
&&&&&&&&&&&&}
&&&&&&&&});
&&&&fs.exists(sPath,function
(exists) {
&&&&&&&&if(!exists) {
&&&&&&&&&&&&cb();
&&&&&&&&}else if
(aPath.length&
&&&&&&&&&&&&self.mkdir(aPath.join('/'),mode,fn,sPath.replace(/\/$/,'')
+'/');
&&&&&&&&}else
&&&&&&&&&&&&fn();
module.exports=
2)&URL系统(./module/URL.js)
&* URL处理类
&* Created by 汤文辉 on .
var urlUtil = require(&url&);
var pathUtil = require(&path&);
function(){
&* @desc获取URL地址 路径部分 不包含域名以及QUERYSTRING
&* @paramstring url
&* @returnstring
URL.getUrlPath=
function(url){
&&&&if(!url){
&&&&&&&&return'';
&&&&varoUrl = urlUtil.parse(url);
&&&&if(oUrl[&pathname&]
&& (/\/$/).test(oUrl[&pathname&])){
&&&&&&&&oUrl[&pathname&] +=&index.html&;
&&&&if(oUrl[&pathname&]){
&&&&&&&&returnoUrl[&pathname&].replace(/^\/+/,'');
&&&&return'';
&* @desc判断是否是合法的URL地址一部分
&* @paramstring urlPart
&* @returnboolean
URL.isValidPart=
function(urlPart){
&&&&if(!urlPart){
&&&&&&&&return false;
&&&&if(urlPart.indexOf(&javascript&)
&&&&&&&&return false;
&&&&if(urlPart.indexOf(&mailto&)
&&&&&&&&return false;
&&&&if(urlPart.charAt(0)
&&&&&&&&return false;
&&&&if(urlPart ==='/'){
&&&&&&&&return false;
&&&&if(urlPart.substring(0,4)
=== &data&){//base64编码图片
&&&&&&&&return false;
&&&&return true;
&* @desc修正被访问地址分析出来的URL 返回合法完整的URL地址
&* @paramstring url 访问地址
&* @paramstring url2 被访问地址分析出来的URL
&* @returnstring || boolean
URL.prototype.fix=
function(url,url2){
&&&&if(!url || !url2){
&&&&&&&&return false;
&&&&varoUrl = urlUtil.parse(url);
&&&&if(!oUrl[&protocol&]
|| !oUrl[&host&] || !oUrl[&pathname&]){//无效的访问地址
&&&&&&&&return false;
&&&&if(url2.substring(0,2)
=== &//&){
&&&&&&&&url2 = oUrl[&protocol&]+url2;
&&&&varoUrl2 = urlUtil.parse(url2);
&&&&if(oUrl2[&host&]){
&&&&&&&&if(oUrl2[&hash&]){
&&&&&&&&&&&&deleteoUrl2[&hash&];
&&&&&&&&returnurlUtil.format(oUrl2);
&&&&varpathname = oUrl[&pathname&];
&&&&if(pathname.indexOf('/')
&&&&&&&&pathname = pathname.substring(0,pathname.lastIndexOf('/'));
&&&&if(url2.charAt(0)
&&&&&&&&pathname = '';
&&&&url2 = pathUtil.normalize(url2);//修正
&&&&url2 = url2.replace(/\\/g,'/');
&&&&while(url2.indexOf(&../&)
& -1){//修正以../开头的路径
&&&&&&&&pathname = pathUtil.dirname(pathname);
&&&&&&&&url2 = url2.substring(3);
&&&&if(url2.indexOf('#')
&&&&&&&&url2 = url2.substring(0,url2.lastIndexOf('#'));
&&&&}else if(url2.indexOf('?')
&&&&&&&&url2 = url2.substring(0,url2.lastIndexOf('?'));
&&&&varoTmp = {
&&&&&&&&&protocol&: oUrl[&protocol&],
&&&&&&&&&host&: oUrl[&host&],
&&&&&&&&&pathname&: pathname +'/'
+ url2
&&&&returnurlUtil.format(oTmp);
module.exports=
3)&Robot系统(即爬虫系统主体)
&* 网页爬虫
&* Created by 汤文辉 on .
var File = require(&./File.js&);
var URL = require(&./URL.js&);
var http = require(&http&);
var https = require(&https&);
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
var BufferHelper = require(&bufferhelper&);
var request = require('request');
var oResult = {
&&&&aNewURLQueue: [],//尚未执行爬取任务的队列
&&&&aOldURLQueue: [],//已完成爬取任务的队列
&&&&aTargetURLList: [],//目标对象URL集合
&&&&oTargetInfoList: {},//目标对象集合
&&&&oRetryCount:{},//失败重试记录
&&&&iCount:0,//爬取url总数
&&&&iSuccessNum:0//爬取成功数
&* 爬虫程序主体
&* @paramoptions
&* @constructor
var Robot=
function(options) {
&&&&varself =
&&&&this.domain= options.domain||
&&;//需要爬取网站的域名
&&&&this.firstUrl= options.firstUrl||
&&;//需要爬取网站的url
&&&&this.id=
this.constructor.create();//唯一标识符
&&&&this.encoding= options.encoding||
&UTF-8&;//页面编码
&&&&this.outputPath=
options.outputPath||
&&;//爬取内容存放路径
&&&&this.outputFileName=
options.outputFileName||
&result.txt&;//结果保存文件名
&&&&this.timeout= options.timeout||
5000;//超时时间
&&&&this.retryNum= options.retryNum||
5;//失败重试次数
&&&&this.robots= options.robots||
true;//是否读取robots.txt文件
&&&&this.debug= options.debug||
false;//是否开启调试模式
&&&&this.file=
&&&&&&&&path:this.outputPath,
&&&&&&&&filename:this.outputFileName
&&&&oResult.aNewURLQueue.push(this.firstUrl);//将第一个url添加进队列之中
&&&&this.handlerComplete=
options.handlerComplete||
function(){//队列中所有的url均抓取完毕时执行回调
&&&&&&&&&&&&console.log(&抓取结束...&);
&&&&&&&&&&&&varstr =
&&,i=0,len=oResult.aTargetURLList.length;
&&&&&&&&&&&&for(i=0;i&len;i++){
&&&&&&&&&&&&&&&&url = oResult.aTargetURLList[i];
&&&&&&&&&&&&&&&&str+=&(&+oResult.oTargetInfoList[url].name+&)
: &+url+&\n&
&&&&&&&&&&&&}
&&&&&&&&&&&&this.file.save(str,true);
&&&&&&&&&&&&this.file.save(&\n抓取完成...\n&,true);
&&&&&&&&};
&&&&this.disAllowArr=
[];//不允许爬取路径
&&&&varrobotsURL =
this.firstUrl+&robots.txt&;
&&&&request(robotsURL,function(error,response,body){
&&&&&&&&if(!error && response.statusCode==
&&&&&&&&&&&&this.disAllowArr=
self.parseRobots(body);
//默认唯一标识
&* 累加唯一标识
&* @returns{number}
Robot.create=
function() {
&&&&return this.id++;
&* 解析robots.txt
&* @paramstr
&* @returns{Array}
Robot.prototype.parseRobots=
function(str){
&&&&varline = str.split(&\r\n&);
0,len=line.length,arr
&&&&for(i=0;i&len;i++){
&&&&&&&&if(line[i].indexOf(&Disallow:&)!=-1){
&&&&&&&&&&&&arr.push(line[i].split(&:&)[1].trim())
&&&&returnarr;
&* 判断当前路径是否允许爬取
&* @paramurl
&* @returns{boolean}
Robot.prototype.isAllow=
function(url){
0,len=this.disAllowArr.length;
&&&&for(i=0;i&len;i++){
&&&&&&&&if(url.toLowerCase().indexOf(this.disAllowArr[i].toLowerCase())!=-1){
&&&&&&&&&&&&return false;
&&&&return true;
&* 开启爬虫任务
Robot.prototype.go=
function(callback) {
&&&&varurl =
&&&&if(oResult.aNewURLQueue.length&0){
&&&&&&&&url = oResult.aNewURLQueue.pop();
&&&&&&&&if(this.robots&&this.isAllow(url)){
&&&&&&&&&&&&this.send(url,callback);
&&&&&&&&&&&&oResult.iCount++;
&&&&&&&&&&&&oResult.aOldURLQueue.push(url);
&&&&&&&&}else{
&&&&&&&&&&&&console.log(&禁止爬取页面:&+url);
&&&&}else{
&&&&&&&&this.handlerComplete.call(this,oResult,this.file);
&* 发送请求
&* @paramurl &&请求链接
&* @paramcallback &请求网页成功回调
Robot.prototype.send=
function(url,callback){
&&&&varself =
&&&&vartimeoutEvent;//由于nodejs不支持timeout,所以,需要自己手动实现
&&&&varreq =
&&&&if(url.indexOf(&https&)
&&&&&&&&req = https.request(url);
&&&&&&&&req = http.request(url);
&&&&timeoutEvent = setTimeout(function()
&&&&&&&&req.emit(&timeout&);
&&&&},this.timeout);
&&&&req.on('response',function(res){
&&&&&&&&varaType = self.getResourceType(res.headers[&content-type&]);
&&&&&&&&varbufferHelper =
newBufferHelper();
&&&&&&&&if(aType[2]
!== &binary&){
&&&&&&&&} else{
&&&&&&&&&&&&res.setEncoding(&binary&);
&&&&&&&&res.on('data',function(chunk){
&&&&&&&&&&&&bufferHelper.concat(chunk);
&&&&&&&&});
&&&&&&&&res.on('end',function(){//获取数据结束
&&&&&&&&&&&&clearTimeout(timeoutEvent);
&&&&&&&&&&&&self.debug&&
console.log(&\n抓取URL:&+url+&成功\n&);
&&&&&&&&&&&&//将拉取的数据进行转码,具体编码跟需爬去数据的目标网站一致
&&&&&&&&&&&&data= iconv.decode(bufferHelper.toBuffer(),self.encoding);
&&&&&&&&&&&&//触发成功回调
&&&&&&&&&&&&self.handlerSuccess(data,aType,url,callback);
&&&&&&&&&&&&//回收变量
&&&&&&&&&&&&data=
&&&&&&&&});
&&&&&&&&res.on('error',function(){
&&&&&&&&&&&&clearTimeout(timeoutEvent);
&&&&&&&&&&&&self.handlerFailure(url);
&&&&&&&&&&&&self.debug&&
console.log(&服务器端响应失败URL:&+url+&\n&);
&&&&&&&&});
&&&&}).on('error',function(err){
&&&&&&&&clearTimeout(timeoutEvent);
&&&&&&&&self.handlerFailure(url);
&&&&&&&&self.debug&&
console.log(&\n抓取URL:&+url+&失败\n&);
&&&&}).on('finish',function(){//调用END方法之后触发
&&&&&&&&self.debug&&
console.log(&\n开始抓取URL:&+url+&\n&);
&&&&req.on(&timeout&,function()
&&&&&&&&//对访问超时的资源,进行指定次数的重新抓取,当抓取次数达到预定次数后将不在抓取改url下的数据
&&&&&&&&if(oResult.oRetryCount[url]==undefined){
&&&&&&&&&&&&oResult.oRetryCount[url] =0;
&&&&&&&&}else if(oResult.oRetryCount[url]!=undefined&&oResult.oRetryCount[url]&self.retryNum){
&&&&&&&&&&&&oResult.oRetryCount[url]++;
&&&&&&&&&&&&console.log(&请求超时,调度到队列最后...&);
&&&&&&&&&&&&oResult.aNewURLQueue.unshift(url);
&&&&&&&&if(req.res)
&&&&&&&&&&&&req.res.emit(&abort&);
&&&&&&&&req.abort();
&&&&req.end();//发起请求
&* 修改初始化数据,须在调用go方法前使用方能生效
&* @paramoptions
Robot.prototype.setOpt=
function(options){
&&&&this.domain= options.domain||
this.domain||&&;//需要爬取网站的域名
&&&&this.firstUrl= options.firstUrl||
this.firstUrl||
&&;//需要爬取网站的url
&&&&this.id=
this.constructor.create();//唯一标识符
&&&&this.encoding= options.encoding||
this.encoding||
&UTF-8&;//页面编码
&&&&this.outputPath=
options.outputPath||
this.outputPath||
&&;//爬取内容存放路径
&&&&this.outputFileName=
options.outputFileName||
this.outputFileName||
&result.txt&;//结果保存文件名
&&&&this.timeout= options.timeout||
this.timeout||
5000;//超时时间
&&&&this.retryNum= options.retryNum||
this.retryNum||
5;//失败重试次数
&&&&this.robots= options.robots||
this.robots||
true;//是否读取robots.txt文件
&&&&this.debug= options.debug||
this.debug||
false;//是否开启调试模式
&&&&this.file=
&&&&&&&&path:this.outputPath,
&&&&&&&&filename:this.outputFileName
&&&&oResult.aNewURLQueue.push(this.firstUrl);//将第一个url添加进队列之中
&&&&this.handlerComplete=
options.handlerComplete||
this.handlerComplete||
function(){
&&&&&&&&&&&&console.log(&抓取结束...&);
&&&&&&&&&&&&varstr =
&&,i=0,len=oResult.aTargetURLList.length;
&&&&&&&&&&&&for(i=0;i&len;i++){
&&&&&&&&&&&&&&&&url = oResult.aTargetURLList[i];
&&&&&&&&&&&&&&&&str+=&(&+oResult.oTargetInfoList[url].name+&)
: &+url+&\n&
&&&&&&&&&&&&}
&&&&&&&&&&&&this.file.save(str,true);
&&&&&&&&&&&&this.file.save(&\n抓取完成...\n&,true);
&&&&&&&&};
&* 数据拉取成功回调
&* @paramdata &拉取回来的数据
&* @paramaType 数据类型
&* @paramurl &&访问链接
&* @paramcallback &用户给定访问成功回调,抛出给用户做一些处理
Robot.prototype.handlerSuccess=
function(data,aType,url,callback){
&&&&if(callback){
&&&&&&&&var$ = cheerio.load(data);
&&&&&&&&callback.call(this,$,aType,url,oResult.aNewURLQueue,oResult.aTargetURLList,oResult.oTargetInfoList);
&&&&&&&&oResult.iSuccessNum++;
&&&&&&&&this.go(callback);
&&&&}else{
&&&&&&&&this.go();
&* 失败后继续执行其他爬取任务
&* @paramurl
Robot.prototype.handlerFailure=
function(url){
&&&&//oResult.aNewURLQueue.indexOf(url)==-1&&oResult.aNewURLQueue.unshift(url);
&&&&this.go();
&* @desc判断请求资源类型
&* @paramstring &Content-Type头内容
&* @return[大分类,小分类,编码类型] [&image&,&png&,&utf8&]
Robot.prototype.getResourceType=
function(type){
&&&&if(!type){
&&&&&&&&return'';
&&&&varaType = type.split('/');
&&&&aType.forEach(function(s,i,a){
&&&&&&&&a[i] = s.toLowerCase();
&&&&if(aType[1] && (aType[1].indexOf(';')
&&&&&&&&varaTmp = aType[1].split(';');
&&&&&&&&aType[1] = aTmp[0];
&&&&&&&&for(vari
= 1;i & aTmp.length;i++){
&&&&&&&&&&&&if(aTmp[i] && (aTmp[i].indexOf(&charset&)
&&&&&&&&&&&&&&&&aTmp2= aTmp[i].split('=');
&&&&&&&&&&&&&&&&aType[2] =aTmp2[1]
?aTmp2[1].replace(/^\s+|\s+$/,'').replace('-','').toLowerCase()
&&&&&&&&&&&&}
&&&&if(([&image&]).indexOf(aType[0])
&&&&&&&&aType[2] =&binary&;
&&&&returnaType;
module.exports=
上面的功能都实现后,我们就可以开始来使用我们的爬虫系统了,首先,在app.js中调用我们的Robot模块
&* Created by 汤文辉 on .
var express = require(&express&);
var Robot = require(&./module/robot.js&);
var schedule = require(&node-schedule&);
function getTime(){
&&&&vardate =
newDate();
&&&&vary = date.getFullYear();
&&&&varm = date.getMonth()+1;
&&&&vard = date.getDate();
&&&&varh = date.getHours();
&&&&varmi = date.getMinutes();
&&&&vars = date.getSeconds();
&&&&m = m&10?&0&+m:m;
&&&&d = d&10?&0&+d:d;
&&&&h = h&10?&0&+h:h;
&&&&mi = mi&10?&0&+mi:mi;
&&&&s = s&10?&0&+s:s;
&&&&returny+&_&+m+&_&+d+&_&+h+&_&+mi+&_&+s;
var options = {
&&&&domain:&dytt8.net&,
&&&&firstUrl:&http://www.dytt8.net/&,
&&&&outputPath:&./output/testRobot/&,
&&&&outputFileName:&test.txt&,
&&&&encoding:&GBK&,
&&&&timeout:6000,
&&&&robots:true,
&&&&debug:true,
&&&&handlerComplete:function(oResult,file){
&&&&&&&&console.log(&抓取结束...&);
&&&&&&&&file.save(&\n抓取完成...\n总共访问网页数为&+oResult.iCount+&条,其中成功访问网页数&+oResult.iSuccessNum+&条&,true);
var robot =new
Robot(options);
var reg1 =/\/html\/[a-z0-9]+\/[a-z0-9]+\/[\d]+\/[\d]+\.html/gmi;
var reg2 =/\/html\/[a-z0-9]+\/index\.html/gmi;
//var reg3 = /(ftp|http):\/\/.+\.(rmvb|mp4|avi|flv|mkv|3gp|wmv|wav|mpg|mov)/
function start(){
&&&&robot.go(function($,aType,url,aNewURLQueue,aTargetURLList,oTargetInfoList){
&&&&&&&&varself =
&&&&&&&&varpUrl = url;
&&&&&&&&if(url===options.firstUrl){
&&&&&&&&&&&&varaA = $(&a&);
&&&&&&&&&&&&aA.each(function(){
&&&&&&&&&&&&&&&&varhref = $(this).attr('href');
&&&&&&&&&&&&&&&&if(href.indexOf(&http://&)==-1){
&&&&&&&&&&&&&&&&&&&&href = options.firstUrl+href.substring(1);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&varres = reg1.exec(href);
&&&&&&&&&&&&&&&&if(res){
&&&&&&&&&&&&&&&&&&&&aNewURLQueue.indexOf(href)==-1&&aNewURLQueue.push(href);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&});
&&&&&&&&}else{
&&&&&&&&&&&&$('a').each(function(){
&&&&&&&&&&&&&&&&varhref = $(this).attr('href');
&&&&&&&&&&&&&&&&varres2 = reg2.exec(href);
&&&&&&&&&&&&&&&&console.log(&页面[&+pUrl+&]二级页面:【&+
href + &】&);
&&&&&&&&&&&&&&&&if(href.indexOf(&thunder://&)!=-1){
&&&&&&&&&&&&&&&&&&&&varurl = $(this).text().trim();
&&&&&&&&&&&&&&&&&&&&console.log(&\n目标链接【&+$(&h1&).text().trim()+&】:&+url+&\n&);
&&&&&&&&&&&&&&&&&&&&varname = $(&h1&).text().trim();
&&&&&&&&&&&&&&&&&&&&if(aTargetURLList.indexOf(url)){
&&&&&&&&&&&&&&&&&&&&&&&&aTargetURLList.push(url);
&&&&&&&&&&&&&&&&&&&&&&&&oTargetInfoList[url] = {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&name:name
&&&&&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&self.file.save(url+&\n&,true);
&&&&&&&&&&&&&&&&}else if(href.indexOf(&ftp://&)!=-1){
&&&&&&&&&&&&&&&&&&&&varurl = $(this).attr(&href&);
&&&&&&&&&&&&&&&&&&&&console.log(&\n目标链接【&+$(&h1&).text().trim()+&】:&+url+&\n&);
&&&&&&&&&&&&&&&&&&&&varname = $(&h1&).text().trim();
&&&&&&&&&&&&&&&&&&&&if(aTargetURLList.indexOf(url)){
&&&&&&&&&&&&&&&&&&&&&&&&aTargetURLList.push(url);
&&&&&&&&&&&&&&&&&&&&&&&&oTargetInfoList[url] = {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&name:name
&&&&&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&self.file.save(url+&\n&,true);
&&&&&&&&&&&&&&&&}else if(res2){
&&&&&&&&&&&&&&&&&&&&if(href.indexOf(&http://&)==-1){
&&&&&&&&&&&&&&&&&&&&&&&&href = options.firstUrl+href.substring(1);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&varres = reg1.exec(href);
&&&&&&&&&&&&&&&&&&&&if(res){
&&&&&&&&&&&&&&&&&&&&&&&&aNewURLQueue.indexOf(href)==-1&&aNewURLQueue.push(href);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&});
var rule =new
schedule.RecurrenceRule();
rule.dayOfWeek= [0,new
schedule.Range(1,6)];
rule.hour=
rule.minute=
console.log(&定时爬取任务,下次爬取时间为&+rule.hour+&时&+rule.minute+&分&);
var j = schedule.scheduleJob(rule,function(){
&&&&robot.setOpt({
&&&&&&&&outputFileName:getTime()+&-&+&电影天堂.txt&
&&&&console.log(&开始定时爬取任务...&);
&&&&start();
然后,我们在命令行中输入
node app.js
运行即可,爬虫将会在星期一~星期天的晚上19:45分定时爬取电影天堂电影下载链接,并输出到output目录中
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3027次
排名:千里之外
(3)(1)(1)(1)}

我要回帖

更多关于 python爬虫爬取微信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信