实现步骤

  1. 连接数据库
  2. 请求需要爬取的内容
  3. 解析获取的数据
  4. 写入数据库

安装并引入所需依赖

1
npm install --save mysql axios cheerio
1
2
3
const mysql = require('mysql') // 操作数据库
const axios = require('axios') // 发起请求
const cheerio = require('cheerio') // 解析HTML

连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var connection = mysql.createConnection({
host: 'XXXXXXX',
user: 'XXXXXXX',
password: 'XXXXXXX',
database: 'XXXXXXX',
})
connection.connect((err) => {
if (err) {
console.log('连接失败: ' + err)
return
}
console.log('连接成功!')
getDouban250() // 连接成功后执行爬取操作
})

请求需要爬取的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 获取豆瓣电影Top250每部电影详情页面
async function getDouban250(start = 0) {
console.log(`正在获取数据(${start + 1}~${start + 25})...`)
const { data: html } = await axios.get(
`https://movie.douban.com/top250?start=${start}&filter=`
)
const $ = cheerio.load(html)
let urlArr = $('ol.grid_view > li > div > div.pic > a').map((i, item) => {
const movieUrl = $(item).attr('href')
return movieUrl
})
start += 25
if (start >= 250) {
// 爬取结束,断开数据库
connection.end()
console.log('over!')
return
} else {
await sleep(3000)
getDouban250(start)
}
}

解析数据并写入数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 单部电影数据解析
async function getMovieData(url) {
const { data: movieHtml } = await axios.get(url)
// 解析html或json
const _$ = cheerio.load(movieHtml)
const info = _$('#info').html().replace(/\s/g, '')
const movie = {
imdb: info.match(/IMDb.*?<br>/)?.[0].replace(/<.*?>|IMDb|:/g, ''),
name: _$('#content > h1 > span:nth-child(1)').text().split(' ')?.[0],
imgUrl: _$('#mainpic > a > img').attr('src'),
detail: _$('#link-report-intra > span:nth-child(1)').text(),
}
// 生成sql语句
let keyStr = ''
let valueStr = ''
for (const key in movie) {
movie[key] = movie[key].replace(/\s/g, '').replace(/'/g, '')
keyStr += key + ','
valueStr += movie[key] + ','
}
const sqlStr =
'insert into douban250 (' +
keyStr.slice(0, -1) +
') values (' +
valueStr.slice(0, -1) +
')'
// 将数据插入数据库
connection.query(sqlStr, function (err, results, fields) {
if (err) {
console.log('新增出错: 《' + movie.name + '》\n' + err)
console.log(sqlStr)
return
}
})
}

function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}