nodejs爬蟲初試---superagent和cheerio

来源:https://www.cnblogs.com/shapeY/archive/2018/03/05/8506947.html
-Advertisement-
Play Games

前言 早就聽過爬蟲,這幾天開始學習nodejs,寫了個爬蟲 demo ,爬取 博客園首頁的文章標題、用戶名、閱讀數、推薦數和用戶頭像,現做個小總結。 使用到這幾個點: 1、node的核心模塊-- 文件系統 2、用於http請求的第三方模塊 -- superagent 3、用於解析DOM的第三方模塊 ...


前言

  早就聽過爬蟲,這幾天開始學習nodejs,寫了個爬蟲 demo  ,爬取 博客園首頁的文章標題、用戶名、閱讀數、推薦數和用戶頭像,現做個小總結。

  使用到這幾個點:

  1、node的核心模塊-- 文件系統

  2、用於http請求的第三方模塊 -- superagent

  3、用於解析DOM的第三方模塊 -- cheerio

  幾個模塊詳細的講解及API請到各個鏈接查閱,demo中只有簡單的用法。

準備工作

  使用npm管理依賴,依賴信息會存放在package.json中

//安裝用到的第三方模塊
cnpm install --save superagent cheerio

  引入所需要用到的功能模塊

//引入第三方模塊,superagent用於http請求,cheerio用於解析DOM
const request = require('superagent');
const cheerio = require('cheerio');
const fs = require('fs');

 

請求 + 解析頁面

  想要爬到博客園首頁的內容,首先要請求首頁地址,拿到返回的html,這裡使用superagent進行http請求,基本的使用方法如下:

request.get(url)
            .end(error,res){
            //do something          
}        

  向指定的url發起get請求,請求錯誤時,會有error返回(沒有錯誤時,error為null或undefined),res為返回的數據。

  拿到html內容後,要拿到我們想要的數據,這個時候就需要用cheerio解析DOM了,cheerio要先load目標html,然後再進行解析,API和jquery的API非常類似,熟悉jquery上手非常快。直接看代碼實例

//目標鏈接 博客園首頁
let targetUrl = 'https://www.cnblogs.com/';

//用來暫時保存解析到的內容和圖片地址數據
let content = '';
let imgs = [];

//發起請求
request.get(targetUrl)
       .end( (error,res) => {
           if(error){ //請求出錯,列印錯誤,返回
               console.log(error)
               return;
           }
           // cheerio需要先load html
           let $ = cheerio.load(res.text);
           //抓取需要的數據,each為cheerio提供的方法用來遍歷
           $('#post_list .post_item').each( (index,element) => {
               //分析所需要的數據的DOM結構
               //通過選擇器定位到目標元素,再獲取到數據
                let temp = {
                    '標題' : $(element).find('h3 a').text(),
                    '作者' : $(element).find('.post_item_foot > a').text(),
                    '閱讀數' : +$(element).find('.article_view a').text().slice(3,-2),
                    '推薦數' : +$(element).find('.diggnum').text()
                }
                //拼接數據
                content += JSON.stringify(temp) + '\n';
                //同樣的方式獲取圖片地址
                if($(element).find('img.pfs').length > 0){
                    imgs.push($(element).find('img.pfs').attr('src'));
                }
           });
           //存放數據
           mkdir('./content',saveContent);
           mkdir('./imgs',downloadImg);
       })

存儲數據

  上面解析DOM之後,已經拼接了所需要的信息內容,也拿到了圖片的URL,現在就進行存儲,把內容存放到指定目錄的txt文件中,而且下載圖片到指定目錄

  先創建目錄,使用nodejs核心的文件系統

//創建目錄
function mkdir(_path,callback){
    if(fs.existsSync(_path)){
        console.log(`${_path}目錄已存在`)
    }else{
        fs.mkdir(_path,(error)=>{
            if(error){
                return console.log(`創建${_path}目錄失敗`);
            }
            console.log(`創建${_path}目錄成功`)
        })
    }
    callback();  //沒有生成指定目錄不會執行
}

  有了指定目錄之後,可以寫入數據了,txt文件的內容已經有了,直接寫入就可以了使用writeFile()

//將文字內容存入txt文件中
function saveContent() {
    fs.writeFile('./content/content.txt',content.toString());
}

  取到了圖片的鏈接,所以需要再使用superagent下載圖片,存在本地。superagent可以直接返回一個響應流,再配合nodejs的管道,直接把圖片內容寫到本地

//下載爬到的圖片
function downloadImg() {
    imgs.forEach((imgUrl,index) => {
        //獲取圖片名  
        let imgName = imgUrl.split('/').pop();

        //下載圖片存放到指定目錄
        let stream = fs.createWriteStream(`./imgs/${imgName}`);
        let req = request.get('https:' + imgUrl);  //響應流
        req.pipe(stream);
        console.log(`開始下載圖片 https:${imgUrl} --> ./imgs/${imgName}`);         
    } )
}

 

效果  

  執行下demo,看下效果,數據已經正常爬下來了

  

 

   非常簡單的一個demo,可能也沒有那麼嚴謹,不過總是走出了node的第一小步。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 複雜性是不可避免的,而且只會隨時間增長,所以在增加特性時一定要為重構和代碼簡化留出時間。真正遇到問題這前先不要擔心性能。iPhone非常強壯,你可能永遠也不會遇到預想的性能問題。 能過互聯網向一個設備傳送音頻時,可以採用兩種傳輸模型:流式傳輸和下載。 對於流式傳輸,音頻伺服器會按音頻的比特率通過網路 ...
  • 大家可以看到,大眾點評中,為了突出這個購買條,當向上滾動時,該滾動條會顯示在最上面(如圖2),而當用戶滑動回來的時候,又可以恢復回第一張圖的樣子 下麵說一下具體的實現思路: 從這張圖,我們可以看下具體的佈局.實際上在最頂部的位置,有一個購買條1,最開始的時候是隱藏的,而當從上向下滑動到具體位置的時候 ...
  • No1: View的滑動 1)layout()方法的 2)offsetLeftAndRight()與offsetTopAndBottom() 對上面代碼進行修改 3)LayoutParams(改變佈局參數) 同樣對上面代碼進行修改 4)動畫 5)scrollTo與scrollBy scrollTo( ...
  • iOS的記憶體管理機制 Objective-C在iOS中不支持GC(垃圾回收)機制,而是採用的引用計數的方式管理記憶體。 引用計數:在引用計數中,每一個對象負責維護對象所有引用的計數值。當一個新的引用指向對象時,引用計數器就遞增,當去掉一個引用時,引用計數就遞減。當引用計數到零時,該對象就將釋放占有的資 ...
  • 1.Activity的生命周期 生命周期這個事情,是android工程師最基礎的知識,所以今天要講的是一些不一樣的東西。 1.1 OnStart,OnResume,OnPause,OnStop 他們的區別是什麼? OnStart & OnStop, 這一對發生的時候,頁面已經顯示,但是處於backg ...
  • adb工具的使用、adb連接設備、adb連接設備失敗的處理、adb常用命令 ...
  • java.net.UnknownHostException 錯誤解決方向 1. 查看是否申明瞭網路的許可權。     在AndroidManifest中需要聲明網路許可權 ···java ··· 註意申明許可權的節點不要弄錯。 2. 測試真機或者模擬機是否連上了網路 ...
  • 報錯如圖 解決 在 路徑下,刪除所有文件夾,重新run android ps:網上搜了說是說是java解壓縮編碼格式問題什麼的,感覺不靠譜,自己試出來的,不知道對別人有沒有用。 有問題歡迎交流,謝謝閱讀 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...