你不知道的node爬蟲原來這麼簡單

前言

今天給你們帶來的是node簡單爬蟲,對於前端小白也是很是好理解且會很是有成就感的小技能
javascript

爬蟲的思路能夠總結爲:請求 url - > html(信息) -> 解析htmlhtml

這篇文章呢,就帶你們爬取豆瓣TOP250電影的信息前端

工具

爬蟲必備工具:cheerio
cheerio簡單介紹:cheerio是jquery核心功能的一個快速靈活而又簡潔的實現,主要是爲了用在服務器端須要對DOM進行操做的地方。 你們能夠簡單的理解爲用來解析html很是方便的工具。
使用以前只須要在終端安裝便可 npm install cheeriojava

node爬蟲步驟解析

1、選取網頁url,使用http協議get到網頁數據

豆瓣TOP250連接地址:https://movie.douban.com/top250node

首先咱們請求http協議,經過http來拿到網頁的全部數據

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);
    })
複製代碼

2、使用cheerio工具解析須要的內容

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
            })
        })
複製代碼

能夠經過檢查網頁源代碼查看須要的內容在哪一個標籤下面,而後經過$符號來拿到須要的內容,這裏我就拿了電影的名字、評分、電影圖片數據庫

到了這時候,你會發現,node爬蟲實現是很是簡單的,咱們只須要認真分析一下咱們拿到的html數據,將須要的內容拿出來保存在本地就基本完成了

保存數據

下面就是保存數據了,我將數據保存在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學習有很大的幫助,歡迎你們留言討論

相關文章
相關標籤/搜索