天天幾分鐘跟小貓學前端之node系列:用node實現最簡單的爬蟲

先來段求分小視頻:html

https://www.iesdouyin.com/share/video/6550631947750608142/?region=CN&mid=6550632036246555405&titleType=title&timestamp=1525407578&utm_campaign=client_share&app=aweme&utm_medium=ios&iid=30176260384&utm_source=qq&tt_from=mobile_qq&utm_source=mobile_qq&utm_medium=aweme_ios&utm_campaign=client_share&uid=92735989673&did=30176260384前端

本文的教學視頻地址:node

https://v.qq.com/x/page/b0643tut4ze.htmljquery

前言
 
本喵最近工做中須要使用node,並也想晉升爲全棧工程師,因此開始了node學習之旅,在學習過程當中,
我會總結一些實用的例子,作成博文和視頻教程,以實例形式來理解體會node的用法,因此跟小貓一塊兒由淺及深的學node吧!
近期都會是些基礎文章,主要用來了解node的各類功能,很是適合對node有所瞭解但沒有開發node基礎的前端工程師,
等基礎掌握後,後續會進行進階的探索和總結喲
 
 
本文將以抓取百度搜索結果中關鍵詞的相關搜索爲例子,教會你們以nodejs製做最簡單的爬蟲:
 
 
將使用的node模塊及屬性介紹:
 
request:
 
     用於發送頁面請求,抓取頁面代碼
     GET請求
     

 

cheerio:
        
   cheerio 是一個 jQuery Core 的子集,其實現了 jQuery Core 中瀏覽器無關的 DOM 操做 API:
   本例子中將使用 load方法,如下是一個簡單的示例:
     
 
express:
 
     基於Node.js 平臺,快速、開放、極簡的 web 開發框架,這裏主要用來作簡單的路由功能,就不作詳細介紹了,主要是用了get,具體能夠參考官網。
 
 
具體實現:
 
1.首先,咱們要使用express搭建簡單的node服務
 
 
 1 const request = require('request');
 2 const app = express();
 3 
 4 app.get('/:key',function(req,res){
 5     console.log(req.params.key)
 6     
 7 })
 8 
 9 app.listen(3000,()=>{
10     console.log("service start on port 3000");
11 })
 
使用命令行運行node demo.js,並在瀏覽器中訪問 localhost:3000/key 運行結果爲
 
 
 
2. 使用request實現頁面抓取功能
 
 1 const express = require('express');
 2 const request = require('request');
 3 const app = express();
 4 
 5 app.get('/:key',function(req,res){
 6     console.log(req.params.key)
 7     let spider = new Spider();
 8     spider.fetch("http://www.baidu.com/s?wd="+req.params.key,(err,body)=>{
 9         if(!err){
10             res.send(body.toString());
11         }
12     })
13 })
14 
15 app.listen(3000,()=>{
16     console.log("service start on port 3000");
17 })
18 
19 class Spider{
20     fetch(url,callback){
21         request({url: url, encoding : null}, (error, response, body)=>{
22             if (!error && response.statusCode === 200){
23                 callback(null ,body);
24             }else{
25                 callback(error ,'<body></body>');
26             }
27         });
28     }
29 }
使用命令行運行node demo.js,並在瀏覽器中訪問 localhost:3000/key 運行結果爲
 

 

 
3.使用cheerio將頁面代碼解析爲jquery格式,並用jQuery語法找到抓取的內容位置,這樣這個爬蟲就實現了!
 
 1 const express = require('express');
 2 const request = require('request');
 3 const app = express();
 4 const cheerio = require('cheerio');
 5 
 6 app.get('/:key',function(req,res){
 7     let spider = new Spider();
 8     
 9     spider.fetch("http://www.baidu.com/s?wd="+req.params.key,(err,$)=>{
10         spider.fetchCallback(err,$,res)
11     })
12     console.log("http://www.baidu.com/s?wd="+req.params.key)
13 })
14 
15 app.listen(3000,()=>{
16     console.log("service start on port 3000");
17 })
18 
19 class Spider{
20     fetch(url,callback){
21         request({url: url, encoding : null}, (error, response, body)=>{
22             if (!error && response.statusCode === 200){
23                 callback(null ,cheerio.load('<body>'+body+'</body>'));
24             }else{
25                 callback(error ,cheerio.load('<body></body>'));
26             }
27         });
28     }
29     fetchCallback(err,$,res){
30         if(!err){
31             let keyList = [];
32             let table = $('body').find("#rs table").html();
33             res.send(table);
34         }
35 
36     }
37 }

 

 
使用命令行運行node demo.js,並在瀏覽器中訪問 localhost:3000/index 運行結果爲
tips:
有些網站不是utf-8編碼模式,這時能夠使用iconv-lite來解除gb2312的亂碼問題
固然各個網站都有反爬蟲功能,能夠經過 研究怎麼模擬一個正經常使用戶的請來規避部分問題(百度的中文搜索也會被屏蔽)
本文只是個入門,後序有機會將和你們詳細討論進階版
 
謝謝你們的關注
相關文章
相關標籤/搜索