node 简单爬虫系统 爬取爱奇艺

首先查看爱奇艺网站结构

node 简单爬虫系统 爬取爱奇艺_第1张图片

第一层直接找到这个a.nav-list-link元素直接cheerio然后写入把导航名称和二层链接写入data.json文件。最后遍历这个data.json循环出第二层所有视频的链接地址,这个数据量有点大。

node 简单爬虫系统 爬取爱奇艺_第2张图片

这个是第二层的结构直接找到红标的a就Ok ,然后操作同上。

var express = require("express");
var superagent = require("superagent");
var cheerio = require("cheerio");
var fs =  require("fs");
var path = require('path');
var arr = [];
fs.readFile('url.txt','utf8',function(err,obj){
	var reg = /^http|https/;
	var objStr;
	if(reg.test(obj)){
		objStr = obj
	}else{
		objStr = "http:"+obj;
	}
	
	toToo(objStr)
})

function toToo(url){
	superagent.get(url)
	.end((err,data)=>{
		fs.exists('./data.json', (exists) => {
		  	if (exists) {
		  		fs.readFile('index.txt','utf8',(err,str)=> {
	        		var num = parseInt(str);
	        		fs.readFile('data.json','utf8',(err,d)=>{
        				var subDate = require('./dataSub.json');
						var $ = cheerio.load(data.text);
						var urlJson = JSON.parse(d);
						if(num>urlJson.length){
							console.log('全部写入成功')
						}else{
							var dataJson =[];
							dataJson.push({
								firstTitle:urlJson[num].title,
								url:urlJson[num].href
							})
							$('.site-piclist_pic_link').each((index, element)=>{
								dataJson.push({
									title:$(element).attr('title'),
									url:$(element).attr('href')
								})
							})
							subDate.push(dataJson);
							fs.writeFile(path.join(__dirname, 'dataSub.json'),JSON.stringify(subDate) , function (err) {
				        		fs.writeFile(path.join(__dirname, 'index.txt'),num+1, function (err) {
				        			fs.writeFile(path.join(__dirname, 'url.txt'),urlJson[num].href, function (err) {
					        			console.log('第'+num+'次写入成功');
					        			regStr = urlJson[num].href;
					        			toToo(urlJson[num].href)
									});
				        		});
							});
						}
					})
				});
		  	} else {
		    	var $ = cheerio.load(data.text);
		    	console.log(arr)
				$('.nav-list-link').each((index, element)=>{
					arr.push({
						title:$(element).text(),
						href:$(element).attr('href')
					})
				})
				fs.writeFile(path.join(__dirname,'data.json'), JSON.stringify(arr), function (err) {
					fs.writeFile(path.join(__dirname, 'url.txt'),arr[0].href, function (err) {
	        			console.log('第一次写入成功');
	    				toToo(arr[0].href);
					});
	        		
				});
		  	}
		});
	})
}













node 简单爬虫系统 爬取爱奇艺_第3张图片

数据量很大 我测试只遍历了20次就已经这么多了。

我的目录结构

node 简单爬虫系统 爬取爱奇艺_第4张图片

data.json是第一层集合;

dataSub.json是第二层集合;

index.txt是存放当遍历的次数;

url.txt是存放当前遍历的url

开始是想用全局遍历来设置次数和当前url 后来测试发现只要url改变整个变量就会清空。不知道什么问题。只能以文件的形式保存。

你可能感兴趣的:(Node.js,Node.js开发指南)