Node實現小爬蟲

前言

node和Python同樣適合作爬蟲爬取數據進行解析輸出相應格式的json數據。 這個項目爬蟲的基本原理在,獲取到頁面的HTML內容,使用cheerio去解析HTML,操做DOM節點獲取數據。javascript

技術棧

node+express+axoishtml

項目運行

git clone https://github.com/fancyzhe/nodeGetData.git
npm install
npm start
複製代碼

在項目的package.json文件中定義了script"start": "nodemon app.js",用nodemon護node進程,因此是項目中直接運行的app.jsjava

具體解析

引入項目所須要的模塊

express做爲服務器 cheerio將獲取到的HTML內容解析成DOM節點 request請求接口數據 path定義靜態文件訪問路徑node

const express = require("express");
const cheerio = require("cheerio");
const request =  require("request");
const path = require('path')

const app = express();
![](https://user-gold-cdn.xitu.io/2019/3/4/16946c12f810faeb?w=1838&h=438&f=png&s=416121)
//定義要抓取數據的頁面地址URL
const url = "https://movie.douban.com/";
複製代碼

定義抓取頁面HTML內容並解析的方法getData

request請求異步,因此方法返回promise,在.then中去獲取到request的數據。webpack

function getData(){
    let data =[];
    return new Promise((resolve,reject)=>{
        request(url,(err,res,body)=>{
        	//body是頁面的HTML內容,使用cheerio去解析它。
            $ = cheerio.load(body);
            //定義了$對象後,能夠相似jQuery的用法去選擇DOM節點
            let content = $("#screening .ui-slide-item");
            let length = content.length;
            //獲取的DOM節點對象數組進行循環,輸出咱們想要的json對象
            while(length--){
                let title = $(content[length]).attr("data-title");
                title && data.push(title);
            }
            resolve(data)
        })
    })
}
複製代碼

以在審查元素中看到電影的名字在#screening .ui-slide-item節點的data-title屬性中,因此在上面的代碼中用取節點的方式去取出咱們想要的數據 git

審查元素

定義接口/data

這裏至關因而在後端定義了/data接口,本地訪問localhost:3000/data就能夠訪問到send回來的數組data。github

app.get("/data",(req,res)=>{
    console.log("getData")
    getData().then(data=>{
        res.send(data)
    })
});
複製代碼

data

定義express靜態文件訪問路徑

參考地址web

定義了靜態文件後,能夠在直接訪問index.htm去請求接口,再根據數據去改變view。也能夠將數據包裝成本身想要的樣子去render出本身的頁面。express

app.use(express.static(path.join(__dirname, 'public')))npm

data

express進行端口監聽

app.listen(3000,()=>console.log("run 3000"))

最後

項目比較簡單,沒有用webpack起項目,只用簡單的靜態去映射出爬取的數據。這是一個node爬蟲入門的小demo,瞭解爬蟲的基本原理。

項目地址

相關文章
相關標籤/搜索