今天给你们带来的是node简单爬虫,对于前端小白也是很是好理解且会很是有成就感的小技能
javascript
爬虫的思路能够总结为:请求 url - > html(信息) -> 解析htmlhtml
这篇文章呢,就带你们爬取豆瓣TOP250电影的信息前端
爬虫必备工具:cheerio
cheerio简单介绍:cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端须要对DOM进行操做的地方。 你们能够简单的理解为用来解析html很是方便的工具。
使用以前只须要在终端安装便可 npm install cheeriojava
豆瓣TOP250连接地址:https://movie.douban.com/top250
node
const https = require('https');
https.get('https://movie.douban.com/top250',function(res){
// 分段返回的 本身拼接
let html = '';
// 有数据产生的时候 拼接
res.on('data',function(chunk){
html += chunk;
})
// 拼接完成
res.on('end',function(){
console.log(html);
})
})
复制代码
上面代码呢,你们必定要注意咱们请求数据时,拿到的数据是分段拿到的,咱们须要经过本身把数据拼接起来python
res.on('data',function(chunk){
html += chunk;
})
复制代码
拼接完成时 咱们能够输出一下,看一下咱们是否拿到了完整数据jquery
res.on('end',function(){
console.log(html);
})
复制代码
const cheerio = require('cheerio');
res.on('end',function(){
console.log(html);
const $ = cheerio.load(html);
let allFilms = [];
$('li .item').each(function(){
// this 循环时 指向当前这个电影
// 当前这个电影下面的title
// 至关于this.querySelector
const title = $('.title', this).text();
const star = $('.rating_num',this).text();
const pic = $('.pic img',this).attr('src');
// console.log(title,star,pic);
// 存 数据库
// 没有数据库存成一个json文件 fs
allFilms.push({
title,star,pic
})
})
复制代码
能够经过检查网页源代码查看须要的内容在哪一个标签下面,而后经过$符号来拿到须要的内容,这里我就拿了电影的名字、评分、电影图片数据库
下面就是保存数据了,我将数据保存在films.json文件中
将数据保存到文件中,咱们引入一个fs模块,将数据写入文件中去npm
const fs = require('fs');
fs.writeFile('./films.json', JSON.stringify(allFilms),function(err){
if(!err){
console.log('文件写入完毕');
}
})
复制代码
文件写入代码须要写在res.on('end')里面,数据读完->写入
写入完成,能够查看一下films.json,里面是有爬取的数据的。json
咱们爬取的图片数据是图片地址,若是咱们要将图片保存到本地呢? 这时候只须要跟前面请求网页数据同样,把图片地址url请求回来,每一张图片写入到本地便可
function downloadImage(allFilms) {
for(let i=0; i<allFilms.length; i++){
const picUrl = allFilms[i].pic;
// 请求 -> 拿到内容
// fs.writeFile('./xx.png','内容')
https.get(picUrl,function(res){
res.setEncoding('binary');
let str = '';
res.on('data',function(chunk){
str += chunk;
})
res.on('end',function(){
fs.writeFile(`./images/${i}.png`,str,'binary',function(err){
if(!err){
console.log(`第${i}张图片下载成功`);
}
})
})
})
}
}
复制代码
下载图片的步骤跟爬取网页数据的步骤是如出一辙的,咱们将图片的格式保存为.png
写好了下载图片的函数,咱们在res.on('end')里面调用一下函数就大功告成了
// 请求 url - > html(信息) -> 解析html
const https = require('https');
const cheerio = require('cheerio');
const fs = require('fs');
// 请求 top250
// 浏览器输入一个 url, get
https.get('https://movie.douban.com/top250',function(res){
// console.log(res);
// 分段返回的 本身拼接
let html = '';
// 有数据产生的时候 拼接
res.on('data',function(chunk){
html += chunk;
})
// 拼接完成
res.on('end',function(){
console.log(html);
const $ = cheerio.load(html);
let allFilms = [];
$('li .item').each(function(){
// this 循环时 指向当前这个电影
// 当前这个电影下面的title
// 至关于this.querySelector
const title = $('.title', this).text();
const star = $('.rating_num',this).text();
const pic = $('.pic img',this).attr('src');
// console.log(title,star,pic);
// 存 数据库
// 没有数据库存成一个json文件 fs
allFilms.push({
title,star,pic
})
})
// 把数组写入json里面
fs.writeFile('./films.json', JSON.stringify(allFilms),function(err){
if(!err){
console.log('文件写入完毕');
}
})
// 图片下载一下
downloadImage(allFilms);
})
})
function downloadImage(allFilms) {
for(let i=0; i<allFilms.length; i++){
const picUrl = allFilms[i].pic;
// 请求 -> 拿到内容
// fs.writeFile('./xx.png','内容')
https.get(picUrl,function(res){
res.setEncoding('binary');
let str = '';
res.on('data',function(chunk){
str += chunk;
})
res.on('end',function(){
fs.writeFile(`./images/${i}.png`,str,'binary',function(err){
if(!err){
console.log(`第${i}张图片下载成功`);
}
})
})
})
}
}
复制代码
爬虫不是只有python才行的,咱们node也很方便简单,前端新手掌握一个小技能也是很是不错的,对自身的node学习有很大的帮助,欢迎你们留言讨论