1.如何安装
要通过js写爬虫,需要用到三个模块,request、cheerio和fs,其中fs内置了,只需要安装前两个即可,安装命令:
npm install request cheerio
2.获取网页内容
request会向回调函数传递三个参数,分别是error(错误信息),response(响应信息),htmlbody(网页内容):
var request =require('request');
var cheerio=require('cheerio');
var fs=require('fs')
var moviesList=[]; //保存所有电影的数据
request.get('https://movie.douban.com/top250',(err,response,htmlbody)=>{
//如果没有错误并且响应的状态为200 ,则连接成功
if(!err&&response.statusCode==200){
var $=cheerio.load(htmlbody); //所有网页内容
var movieiv=$('.item'); //拿到了对应标签的数组数据
//通过循环获取详细的电影信息
for(var i=0;i<movieiv.length;i++){
var movieInfo=Takemovie(movieiv[i]);
console.log('正在爬取《'+movieInfo.name+'》')
//将电影放入数组中
moviesList.push(movieInfo)
}
}else {
console.log('出错了')
}
})
3.抓取电影信息
通过创建一个类来包含我们想要的属性,在每次调用Takemovie函数提取信息时都会初始化这个类,然后赋值给相应的属性;
之后放入moviesList数组里;
//定义一个movie 类
var Movie=function() {
this.id=0;
this.name=''; //电影名
this.ename=''; //英文名
this.role=''; // 专辑
this.user=''; // 演员
this.score=0; //评分
this.psrc='';
this.dis=''; //描述
}
var Takemovie=function (div) {
var $=cheerio.load(div)
//初始化类
var m=new Movie();
m.id=$('.pic').find('em').text(); //获取id
m.name=$('.info .hd').find('span').eq(0).text(); //电影名
m.ename=$('.info .hd').find('span').eq(1).text(); //英文名
m.role=$('.info .hd .other').text(); //专辑
m.user=$('.info .bd p').text(); //演员
m.score=$('.info .bd .star .rating_num').text(); //评分
m.psrc=$('.pic a img').attr('src'); //
m.dis=$('.info .bd .quote .inq').text(); //影评
return m
}
4.抓取所有电影
现在要爬取所有的top250信息,总共有10张网页,每张包含25部电影信息,创建一个函数来生成每张网页的网址,然后通过request进行爬取:
//爬取所有网页
var getAllMovies= function () {
var len=['https://movie.douban.com/top250'];
var olen='https://movie.douban.com/top250?start=';
var allList=25;
for(var i=0;i<10;i++){
len.push(olen+allList)
allList+=25;
}
return len;
}
var main=function () {
var url=getAllMovies(); //链接地址数组
for(var i=0;i<url.length;i++){
requestMovies(url[i])
}
}
main(); //启动
5.所有代码
var request =require('request');
var cheerio=require('cheerio');
var fs=require('fs')
var moviesList=[]; //保存所有电影的数据
var requestMovies= function (url) {
request.get(url,(err,response,htmlbody)=>{
//如果没有错误并且响应的状态为200 ,则连接成功
if(!err&&response.statusCode==200){
var $=cheerio.load(htmlbody); //所有网页内容
var movieiv=$('.item'); //拿到了对应标签的数组数据
//通过循环获取详细的电影信息
for(var i=0;i<movieiv.length;i++){
var movieInfo=Takemovie(movieiv[i]);
console.log('正在爬取《'+movieInfo.name+'》')
//将电影放入数组中
moviesList.push(movieInfo)
}
// 爬取完毕
if(moviesList.length==250){
console.log('爬取完毕')
// console.log(moviesList);
fs.writeFile('./data.json',JSON.stringify(moviesList),(err)=>{
if(err){
console.log('文件写入失败')
}else{
console.log('文件写入成功')
}
})
}
}else {
console.log('出错了')
}
})
}
//定义一个movie 类
var Movie=function() {
this.id=0;
this.name=''; //电影名
this.ename=''; //英文名
this.role=''; // 专辑
this.user=''; // 演员
this.score=0; //评分
this.psrc='';
this.dis=''; //描述
}
var Takemovie=function (div) {
var $=cheerio.load(div)
//初始化类
var m=new Movie();
m.id=$('.pic').find('em').text(); //获取id
m.name=$('.info .hd').find('span').eq(0).text(); //电影名
m.ename=$('.info .hd').find('span').eq(1).text(); //英文名
m.role=$('.info .hd .other').text(); //专辑
m.user=$('.info .bd p').text(); //演员
m.score=$('.info .bd .star .rating_num').text(); //评分
m.psrc=$('.pic a img').attr('src'); //
m.dis=$('.info .bd .quote .inq').text(); //影评
return m
}
//爬取所有网页
var getAllMovies= function () {
var len=['https://movie.douban.com/top250'];
var olen='https://movie.douban.com/top250?start=';
var allList=25;
for(var i=0;i<10;i++){
len.push(olen+allList)
allList+=25;
}
return len;
}
var main=function () {
var url=getAllMovies(); //链接地址数组
for(var i=0;i<url.length;i++){
requestMovies(url[i])
}
}
main(); //启动
最终结果: