今天給你們帶來的是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學習有很大的幫助,歡迎你們留言討論