注册

node+experss实现爬取电影天堂爬虫

下面详细讲解“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请求,可以获取电影列表。具体过程:

  1. 定义Express路由,监听/movies地址。
  2. 发送HTTP GET请求,获取电影天堂首页的HTML文档。
  3. 使用cheerio解析HTML文档,提取出电影列表。
  4. 将电影列表以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请求,可以获取电影列表和电影详情。具体过程:

  1. 定义Express路由,监听/movies地址。
  2. 发送HTTP GET请求,获取电影天堂首页的HTML文档,并解析出电影列表。
  3. 对于每个电影,发送HTTP GET请求,获取电影详情。
  4. 解析电影详情的HTML文档,提取出电影名称、海报、下载链接等。
  5. 将电影详情返回给客户端。

需要注意的是,获取电影详情时需要使用Promise来处理异步操作。因为无法确定获取电影详情的顺序,使用Promise.all可以等待所有Promise完成后再将电影详情返回给客户端。

这就是全部的攻略啦。