网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更常常的称为网页追逐者),是一种按照必定的规则,自动地抓取万维网信息的程序或者脚本。另一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。大多数爬虫都是按“发送请求”-"获取页面"-"解析页面"-"抽取并储存内容"这样的流程来进行,这其实也是模拟了咱们使用浏览器获取网页信息的过程。javascript
//下载puppeteer npm install puppeteer //下载mongoose npm install mongoose
在这里咱们爬取豆瓣的电影信息来进行测试哦!
看到上面电影信息列表,是否是有种爬取列表信息的冲动?好,咱们先打开开发者选项,查看该列表信息。
咱们能够看到每一个li标签的data-xxx属性中都带有该电影项的信息,咱们经过获取到该信息,而且将其输出到某界面或存储到数据库中,这就实现了爬虫多种用途的一小部分。话很少说咱们来上代码。html
//引入puppeteer模块 const puppeteer = require('puppeteer'); //爬取热门电影信息,的网址 const url = 'https://movie.douban.com/cinema/nowplaying/beijing/'; //由于要请求信息,这里咱们加入async module.exports = async () => { //1. 打开浏览器 const browser = await puppeteer.launch({ args: ['--no-sandbox'], // headless: false //以无头浏览器的形式打开浏览器,没有界面显示,在后台运行的 }); //2. 建立tab标签页 const page = await browser.newPage(); //3. 跳转到指定网址 await page.goto(url, { waitUntil: 'networkidle2' //等待网络空闲时,在跳转加载页面 }); //4. 等待网址加载完成,开始爬取数据 //开启延时器,延时2秒钟在开始爬取数据 await timeout(); let result = await page.evaluate(() => { //对加载好的页面进行dom操做 //全部爬取的数据数组 let result = []; //获取全部热门电影的li,这里能够打开开发者选项进行标签的筛选 const $list = $('#nowplaying>.mod-bd>.lists>.list-item'); //这里咱们只取8条数据 for (let i = 0; i < 8; i++) { const liDom = $list[i]; //电影标题 let title = $(liDom).data('title'); //电影评分 let rating = $(liDom).data('score'); //电影片长 let runtime = $(liDom).data('duration'); //导演 let directors = $(liDom).data('director'); //主演 let casts = $(liDom).data('actors'); //豆瓣id let doubanId = $(liDom).data('subject'); //电影的详情页网址 let href = $(liDom).find('.poster>a').attr('href'); //电影海报图 let image = $(liDom).find('.poster>a>img').attr('src'); //将爬取到的数据加入进该数组中 result.push({ title, rating, runtime, directors, casts, href, image, doubanId }) } //将爬取的数据返回出去 return result; }) console.log(result); //遍历爬取到的8条数据 for (let i = 0; i < result.length; i++) { //获取条目信息 let item = result[i]; //获取电影详情页面的网址 let url = item.href; //跳转到电影详情页 await page.goto(url, { waitUntil: 'networkidle2' //等待网络空闲时,在跳转加载页面 }); //爬取其余数据 let itemResult = await page.evaluate(() => { let genre = []; //类型 const $genre = $('[property="v:genre"]'); for (let j = 0; j < $genre.length; j++) { genre.push($genre[j].innerText); } //简介 const summary = $('[property="v:summary"]').html().replace(/\s+/g, ''); //上映日期 const releaseDate = $('[property="v:initialReleaseDate"]')[0].innerText; //给单个对象添加两个属性 return { genre, summary, releaseDate } }) // console.log(itemResult); //在最后给当前对象添加三个属性 //在evaluate函数中没办法读取到服务器中的变量 item.genre = itemResult.genre; item.summary = itemResult.summary; item.releaseDate = itemResult.releaseDate; } console.log(result); //5. 关闭浏览器 await browser.close(); //最终会将数据所有返回出去 return result; } function timeout() { return new Promise(resolve => setTimeout(resolve, 2000)) }
在此时咱们引入mongoose,进行数据库的链接。话很少说上代码。java
//引入mongoose const mongoose = require('mongoose'); module.exports = new Promise((resolve, reject) => { //链接数据库 mongoose.connect('mongodb://localhost:27017/movie_list', { useNewUrlParser: true, useUnifiedTopology: true }); //绑定事件监听 mongoose.connection.once('open', err => { if (!err) { console.log('数据库链接成功了~~'); resolve(); } else { reject('数据库链接失败:' + err); } }) })
//引入mongoose const mongoose = require('mongoose'); //获取Schema const Schema = mongoose.Schema; //建立约束对象 const theatersSchema = new Schema({ title: String, rating: Number, runtime: String, directors: String, casts: String, image: String, doubanId: { type: Number, unique: true }, genre: [String], summary: String, releaseDate: String, posterKey: String, //图片上传到七牛中,返回的key值 createTime: { type: Date, default: Date.now() } }) //建立模型对象 const Theaters = mongoose.model('Theaters', theatersSchema); //暴露出去 module.exports = Theaters;
//引入Theaters const Theaters = require('../../model/theaters'); module.exports = async data => { for (var i = 0; i < data.length; i++) { let item = data[i]; await Theaters.create({ title: item.title, rating: item.rating, runtime: item.runtime, directors: item.directors, casts: item.casts, image: item.image, doubanId: item.doubanId, genre: item.genre, summary: item.summary, releaseDate: item.releaseDate, }) console.log('数据保存成功'); } }
//引入数据库链接 const db = require('../db'); //引入爬虫 const theatersCrawler = require('./crawler/theatersCrawler'); //引入将爬取信息保存到数据库模块 const saveTheaters = require('./save/saveTheaters'); (async () => { //链接数据库 await db;d //爬取数据 const data = await theatersCrawler(); //将爬取的数据保存在数据库中 await saveTheaters(data); })()
有帮助的话就点个赞呗!mongodb