分享:node爬虫

241 阅读2分钟
原文链接: my.oschina.net

所谓的爬虫,其实就是向你想要抓取的目标站点,发送http请求,分析和提取你想要的资源。下面来讲讲爬虫的基本过程。

  1. 首先选择目标站点,然后发送请求,获取返回的html页面
  2. 接下来你可以使用正则或者常用的解析库如cheerio
  3. 最后提取出想要的数据

这是小编自己写的一个简单的,爬虫仅仅是为了学习爬虫哦。主要是已函数为模块,简单易理解。

  1. 定义url函数,生成url数组
// 生成url地址组
function get_urls (url) {
	var urls = [];
	for (var i = 0; i <= 10; i++) {
		urls.push(url + (i + 1));
	}
	return urls;
}

    2.接下来发送http请求,获取网页内容

// 发送请求获取页面
function get_pages (urls) {
	var pages = [];
	for (let i = 0, len = urls.length; i < len; i++) {
		// 发送http请求
		request(urls[i], (err, res, body)=>{
			if (!err && res.statusCode === 200)
				parse_html(body, i)
		})
	}
	// return pages;
}

    3.到了关键一步了,那就是解析内容了哦,小编采用的是cheerio,解析的哦,如果不会cheerio的可以搜一下文档,cheerio和jquery很类似的哦,轻轻松松入门的。

// 解析整个页面
function parse_html (page, index) {
	var $ = cheerio.load(page);
	var arr = [];
	$("#post-list li").each(function(index, el) {
		arr.push($(this).find('a').attr('href'))
	});
	// 抓取单个页面的视频地址
	get_video_url(arr);
}

    4.最后一步,抓取单个页面的视频地址,然后保存你想要爬取的数据喽!

// 单个页面发送请求,抓取视频地址
function get_video_url (pages_url) {
	var base_url = 'https://www.vmovier.com'
	pages_url.forEach( function(page, index) {
		request((base_url+page), (err, res, body)=>{
			if (!err && res.statusCode === 200) {
				// 解析视频地址
				back_video_url(body);
			}
		})
	});
}

function back_video_url(page) {
	var $ = cheerio.load(page);
	var video = $("iframe").attr('src');
	if (video != undefined) {
		video = video.replace(video[4], '');
		superagent
			.get(video)
			.end((err, res)=>{
				download_video(res.text)
			})
		
	}
}


// 下载视频
function download_video (page) {
	var $ = cheerio.load(page);
	var url = $("#player").attr('href')
	var filename = Math.floor(Math.random()*10000000);
	console.log("正在下载:" + filename);
	request.get("http:" + url)
		.on('error', (err)=>{
			console.log(err)
		})
		.pipe(fs.createWriteStream("./video/"+filename+'.mp4'))
}

小编也是菜鸟一枚,自己突然对爬虫感兴趣了,然后自己学习,掌握了一些爬虫的知识,下面贴一下完整代码

// 发送http请求
var http = require("http");
var request = require('request');
var superagent = require('superagent');
// 解析网页内容
var cheerio = require('cheerio');
// 要爬取url地址
var url = "https://www.vmovier.com/index/index/p/";
var fs = require('fs');
// 生成url地址组
function get_urls (url) {
	var urls = [];
	for (var i = 0; i <= 10; i++) {
		urls.push(url + (i + 1));
	}
	return urls;
}
// 发送请求获取页面
function get_pages (urls) {
	var pages = [];
	for (let i = 0, len = urls.length; i < len; i++) {
		// 发送http请求
		request(urls[i], (err, res, body)=>{
			if (!err && res.statusCode === 200)
				parse_html(body, i)
		})
	}
	// return pages;
}
// 解析整个页面
function parse_html (page, index) {
	var $ = cheerio.load(page);
	var arr = [];
	$("#post-list li").each(function(index, el) {
		arr.push($(this).find('a').attr('href'))
	});
	// 抓取单个页面的视频地址
	get_video_url(arr);
}
// 单个页面发送请求,抓取视频地址
function get_video_url (pages_url) {
	var base_url = 'https://www.vmovier.com'
	pages_url.forEach( function(page, index) {
		request((base_url+page), (err, res, body)=>{
			if (!err && res.statusCode === 200) {
				// 解析视频地址
				back_video_url(body);
			}
		})
	});
}

function back_video_url(page) {
	var $ = cheerio.load(page);
	var video = $("iframe").attr('src');
	if (video != undefined) {
		video = video.replace(video[4], '');
		superagent
			.get(video)
			.end((err, res)=>{
				download_video(res.text)
			})
		
	}
}


// 下载视频
function download_video (page) {
	var $ = cheerio.load(page);
	var url = $("#player").attr('href')
	var filename = Math.floor(Math.random()*10000000);
	console.log("正在下载:" + filename);
	request.get("http:" + url)
		.on('error', (err)=>{
			console.log(err)
		})
		.pipe(fs.createWriteStream("./video/"+filename+'.mp4'))
}

// 主方法体
function main (url) {
	var urls = get_urls(url);
	var pages = get_pages(urls);


}

// 调用main方法
main(url)

总结

小编用函数的形式,简单的实现了爬取网站上的短视频,小站微阅读也用到了爬虫。当然,大家千万不要频繁的去爬取别人的网站哦,有可能ip会被封的。爬虫的知识还有很多,不单单是这么一点,总的说就是革命尚未成功,仍需努力,今天的分享就到这里喽!