nodejs爬虫笔记(三)

思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息。通过分析YouTube,可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类,之后进入到每个分类下的视频列表,最后在具体到每一个视频,获取需要的信息。以订阅号YouTube 电影为例。

一、爬取YouTube 电影里面的视频分类列表

打开订阅号,我们可以发现订阅号下有许多视频分类如下图所示,接下来可以解析该订阅号信息,把视频分类的URL和名称爬取下来。

接下来我们通过浏览器点击检查查看网页,分析下如何获取分类,可以发现所有的视频分类都在ul 下的 li 里面,通过ul的id 我们便可以找到分类的相关信息,因此我们可以利用cheerio模块来解析页面,从而获取分类信息。

先将获取分类信息的相关代码分装成一个函数function categoryList (url , callback){},代码如下:

var request =require(‘superagent‘);
require(‘superagent-proxy‘)(request);

var cheerio = require(‘cheerio‘);
var debug = require(‘debug‘)(‘youtube:test:category-list‘);

var proxy = ‘http://127.0.0.1:61481‘;//设置代理IP地址

//请求头信息
var header = {
	‘Accept‘:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8‘,
    ‘Accept-Encoding‘:‘gzip, deflate, sdch, br‘,
    ‘Accept-Language‘:‘zh-CN,zh;q=0.8,en;0.6‘,
    ‘Cookie‘:‘WKcs6.resume=; _ga=GA1.2.1653214693.1476773935; _gid=GA1.2.943573022.1500212436; YSC=_X6aKoK1jMc; s_gl=1d69aac621b2f9c0a25dade722d6e24bcwIAAABVUw==; VISITOR_INFO1_LIVE=T3BczuPUIQo; PREF=hl=zh-CN&cvdm=grid&gl=US&f1=50000000&al=zh-CN&f6=1&f5=30; SID=7gR6XOImfW5PbJLOrScScD4DXf8cHCkWCkxSUFy9CbhnaFaPLBCVCElv97n_mjWgkPC_ow.; HSID=A0_bKgPkAZLJUfnTj; SSID=ASjQTON7p_q4UNgit; APISID=ZIVPX9a3vUKRa28E/A0dykxLiVJ4xDIUS_; SAPISID=t6dcqHC9pjGsE7Bi/ATm5wgRC27rqUQr5B; CONSENT=YES+CN.zh-CN+20160904-14-0; LOGIN_INFO=APUNbegwRQIhAPnMZ-qYHOSAKq0s9ltEQIUvnWNj9CHQ8J5s2JtZK15TAiBLzfS4HEUh-mWGo2Qo6XOruItGRdpPZ2v3cXLqYY7xtA:QUZKNV9BajdRR2VZQ2QyRlVDdXh3VDdKZ1AzMlFqRmg3aTBfR2pxWXFHWXlXYm1BaVVnQWk4UzZfWmZGSGcxRkNuTDBFYTk2a2tKLUEtNmtNaWZKM3hTMWNTZkgyOVlvTF9DNENwTG5XTlJudEVHQzVIeGxMbTFTdkl6YS02QlBmMmM0NVgteWI3QVNIa3c5c2ZkV1NSa3AzbWhwOHBtbzVrVTVSbTBqaWpIZ0dWNTd4UjJRSllr‘,
    ‘Upgrade-insecure-requests‘:‘1‘,
    ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36‘,
    ‘X-Chrome-Uma-Enabled‘:‘1‘,
    ‘X-Client-Data‘:‘CJa2yQEIorbJAQjBtskBCKmdygE=‘,
    ‘Connection‘: ‘keep-alive‘
};

//获取订阅号下视频分类列表
function categoryList (url , callback){
	debug(‘读取订阅号下视频分类列表‘,url);

	request
	.get(url)//需要获取的网址
	.set(‘header‘,header)
	.proxy(proxy)
	.end(onresponse);

	function onresponse(err,res){
		//res.setEncoding(‘utf-8‘); //防止中文乱码
		if(err){
			return callback(err);
		}else{
			console.log(‘status:‘+res.status);//打印状态码
			//console.log(res.text);
			var $ = cheerio.load(res.text);
			//获取订阅号Id
			var $channelName = $(‘#c4-primary-header-contents .branded-page-header-title a‘).attr(‘href‘);
			var $channelId = $channelName.match(/channel\/([a-zA-Z0-9_-]+)/);

			var categoryList = [];
			$(‘#browse-items-primary .branded-page-module-title‘).each(function(){
				var $category = $(this).find(‘a‘).first();
				var item = {
					name : $category.text().trim(),
					url : ‘https://www.youtube.com‘ + $category.attr(‘href‘)
				};
				//根据URL判断为订阅号或者是视频分类
				if(item.url.indexOf(‘list‘)!==-1){
					item.channelId = $channelId[1];
				}else{
					var s = item.url.match(/channel\/([a-zA-Z0-9_-]+)/);
					item.id = s[1];
				}
				//获取youtube某个订阅号下的视频分类
				if(item.name!==‘‘){
					categoryList.push(item);
				}
			});	

			callback(null,categoryList);
		}
	}
}

接着调用categoryList函数:

categoryList(‘https://www.youtube.com/channel/UClgRkhTL3_hImCAmdLfDE4g‘,function(err,categoryList){
	if(err){
		return console.log(err);
	}
	return console.log(categoryList);
});

在后台运行就得到了视频分类信息,这是会发现视频分类里面又包含了某些订阅号,而我们只需要提取视频分类。

去除订阅号信息(当然也可以添加到订阅号列表,然后再依次读取订阅号下的视频分类)

//获取youtube某个订阅号下的视频分类
if(item.name!==‘‘){
	categoryList.push(item);
}
替换为
//获取youtube某个订阅号下的视频分类
				if(item.categoryName!==‘‘&&item.hasOwnProperty(‘channelId‘)){
	categoryList.push(item);
}

这是再运行会发现订阅号的信息已经剔除了,接下来进入到下一层,通过视频分类获取视频列表

二、获取视频列表

我们以最卖座电影为例,获取其下面的视频列表。点击打开页面,我们会发现该分类下视频列表全部在在里面,我们同样只获取其url 以及名称。

点击检查(ps:我用的Google浏览器),先查看下网页结构,再用cheerio进行解析。检查发现我们可以通过tbody中的tr获取每个视频。

时间: 2024-08-09 19:52:50

nodejs爬虫笔记(三)的相关文章

nodejs爬虫笔记(二)

node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var cheerio = require('cheerio');**** var url = 'https://www.youtube.com '; function crawler(url,callback){ var list = []; request(url,function(err,res){ if(e

nodejs 爬虫笔记

目标:爬取慕课网里面一个教程的视频信息,并将其存入mysql数据库.以http://www.imooc.com/learn/857为例. 一.工具 1.安装nodejs:(操作系统环境:WiN 7 64位)  在Windows环境下安装相对简单(ps:其他版本我也不太清楚,可以问度娘) http://nodejs.org/download/ 链接中下载对应操作系统安装文件(安装最新版本就行) 按照提示,一路下一步直到安装成功后,在默认安装路径下可以看到(C:\Program Files\node

nodejs爬虫笔记(五)---利用nightmare模拟点击下一页

目标 以腾讯滚动新闻为例,利用nightmare模拟点击下一页,爬取所有页面的信息.首先得感谢node社区godghdai的帮助,开始接触不太熟悉nightmare,感觉很高大上,自己写代码的时候问题也很多,多亏大神的指点. 一.选择模拟的原因 腾讯滚动新闻,是每六十秒更新一次,而且有下一页.要是直接获取页面的话得一页一页的获取,不太方便,又想到了找数据接口,然后通过请求得到数据,结果腾讯新闻的数据接口是加密的,这种想法又泡汤了.因而想到笔记(四)中模拟加载更多的模块,看利用nightmare这

nodejs学习笔记<三>关于路由(url)

在网站开发中,路由的设置非常关键.nodejs对路由处理封装了一个比较全面的模块. 来认识下url模块 1)在命令行(cmd)可以直接 node —> url 可直接查看url模块的所有方法. 2)在js中通过require调用url模块.var url = require('url'); url包括:parse,resolve,resolveObject,format,Url 五个方法. 1)parse: parse用来解析url地址.同样可以直接用命令行(cmd)调用,也可以在js中通过ur

nodejs学习笔记三(用户注册、登录)

1.定接口 /user 接口 输入    act=reg&user=aaa&pass=123456 输出     {"ok":false, "msg":"原因"} 输入     act=login&user=aaa&pass=123456 输出     {"ok": true, "msg":"原因"} 2.server.js 解析数据 读取文件 访问的情况

NodeJS 学习笔记(三)

path 模块,本模块包含一系列处理和转换文件路径的工具集. path.normalize(path)   normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠. path.normalize('/foo/bar//baz/asdf/quux/..') // returns '/foo/bar/baz/asdf' path.join([path1][, path2][, ...])  连接所有的参数,并规范化输出路径. 参数必须是字符串.

Nodejs学习笔记(三)——一张图看懂Nodejs建站

前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试Nodejs>之后,代码编写环境就从Sublime转战到Eclipse下,感觉顺手多了.于是就跟着Scott老师学起了Nodejs建站的课程(推荐大家点进去看看),踏上了未爬先走的路子. 作为一个白里透白的小白来说,今天主要记录下如何用Nodejs搭建一个小小的网站,以及自己对于这种Nodejs建站的运

nodejs学习笔记之安装、入门

由于项目需要,最近开始学习nodejs.在学习过程中,记录一些必要的操作和应该注意的点. 首先是如何安装nodejs环境?(我用的是windows 7环境,所以主要是windows 7的例子.如果想看linux下的安装可以参考http://www.cnblogs.com/meteoric_cry/archive/2013/01/04/2844481.html) 1. nodejs提供了一些安装程序,可以去官网(http://nodejs.org/download/)按照自己的机器进行下载,下载完

《R实战》读书笔记三

第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括如下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 理解数据集 一个数据集通常由一个表格组合而成,行表示观测,列表示变量.病人的数据集如表1所示. 表1 病人数据集 数据集能够反映数据结构.数据类型和内容. 数据结构 R数据结构如图2所示. 图2:R数据结构 数据结构即数据的组织方式,R数据结构包括向量.矩阵.数组.数据框和列表等. R向量 R向量是一