下面详细讲解“node+express实现爬取电影天堂”的攻略。
1. 准备工作
在开始爬虫之前,需要进行一些准备工作:
- 安装Node.js和npm,可以在Node.js官网下载对应的安装包进行安装。
- 创建一个新的Node.js项目,并在项目根目录下运行npm init命令初始化项目并创建package.json文件。
- 安装需要的依赖模块:
npm install express request cheerio --save
其中,依赖模块说明:
express
:Web框架,用于搭建Web服务器,并提供路由和中间件处理机制。request
:HTTP客户端库,用于向目标网站发送HTTP请求,获取数据。cheerio
:类似于jQuery的HTML解析库,便于对返回的HTML文档进行解析和提取数据。
2. 获取电影列表
要实现爬取电影天堂的功能,需要先获取电影列表。可以通过向目标网站发送HTTP GET请求,获取HTML文档,在HTML文档中提取出电影列表。
const express = require('express');
const request = require('request');
const cheerio = require('cheerio');
const app = express();
// 定义路由,获取电影列表
app.get('/movies', (req, res) => {
// 电影天堂首页地址
const url = 'https://www.dytt8.net/';
// 发送HTTP GET请求,获取HTML文档
request(url, (err, response, body) => {
if (err) {
console.error(err);
return res.status(500).send('Server error');
}
// 解析HTML文档,提取出电影列表
const $ = cheerio.load(body);
const movieList = [];
$('#menu li:nth-child(2) li a').each((i, elem) => {
const movie = {
name: $(elem).text(),
url: $(elem).attr('href')
};
movieList.push(movie);
});
// 将电影列表返回给客户端
res.json(movieList);
});
});
// 启动Web服务器
app.listen(3000, () => {
console.log('Web server is listening on port 3000');
});
上面的代码中,通过向/movies
地址发送HTTP GET请求,可以获取电影列表。具体过程:
- 定义Express路由,监听
/movies
地址。 - 发送HTTP GET请求,获取电影天堂首页的HTML文档。
- 使用cheerio解析HTML文档,提取出电影列表。
- 将电影列表以JSON格式返回给客户端。
3. 获取电影详情
获取到电影列表之后,还需要获取每个电影的详情,包括电影名称、海报、下载链接等。
const express = require('express');
const request = require('request');
const cheerio = require('cheerio');
const app = express();
// 定义路由,获取电影列表
app.get('/movies', (req, res) => {
// 电影天堂首页地址
const url = 'https://www.dytt8.net/';
// 发送HTTP GET请求,获取HTML文档
request(url, (err, response, body) => {
if (err) {
console.error(err);
return res.status(500).send('Server error');
}
// 解析HTML文档,提取出电影列表
const $ = cheerio.load(body);
const movieList = [];
$('#menu li:nth-child(2) li a').each((i, elem) => {
const movie = {
name: $(elem).text(),
url: $(elem).attr('href')
};
movieList.push(movie);
});
// 获取每个电影的详情
const promises = movieList.map(movie => {
return new Promise((resolve, reject) => {
request(movie.url, (err, response, body) => {
if (err) {
console.error(err);
return reject(err);
}
const $ = cheerio.load(body);
const name = $('.title_all h1 font').text();
const poster = $('img[src$="/pic/posterpic/"]').attr('src');
const download = $('#Zoom table td a').attr('href');
const movieDetail = {
name: name,
poster: poster,
download: download
};
resolve(movieDetail);
});
});
});
// 等待所有Promise完成,返回所有电影的详情
Promise.all(promises)
.then(movieDetails => {
res.json(movieDetails);
})
.catch(err => {
console.error(err);
res.status(500).send('Server error');
});
});
});
// 启动Web服务器
app.listen(3000, () => {
console.log('Web server is listening on port 3000');
});
上面的代码中,通过向/movies
地址发送HTTP GET请求,可以获取电影列表和电影详情。具体过程:
- 定义Express路由,监听
/movies
地址。 - 发送HTTP GET请求,获取电影天堂首页的HTML文档,并解析出电影列表。
- 对于每个电影,发送HTTP GET请求,获取电影详情。
- 解析电影详情的HTML文档,提取出电影名称、海报、下载链接等。
- 将电影详情返回给客户端。
需要注意的是,获取电影详情时需要使用Promise来处理异步操作。因为无法确定获取电影详情的顺序,使用Promise.all可以等待所有Promise完成后再将电影详情返回给客户端。
这就是全部的攻略啦。