成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

什么是Electron

成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,先為武邑等服務(wù)建站,武邑等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為武邑企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

使用 JavaScript, HTML 和 CSS 構(gòu)建跨平臺的桌面應(yīng)用

[官網(wǎng)](https://electronjs.org/)

實質(zhì)就是一個精簡的Webkit瀏覽器顯示html頁面,通過electron做中間層可以和系統(tǒng)交流。給web項目套上一個node環(huán)境的殼。

前言

公司買的推廣居然沒有后臺的api,沒有api又不想死板手動操作。那就做個爬蟲吧。但是又是給小白用的,自然最好帶個界面,本來用C#拖出來就好了,看到vs那么大,下載都要半天。干脆就用Electron做一個,順便學習一下Electron。

準備工作

安裝nodejs

npm安裝electron(最好換成cnpm,不然可能失?。?/p>

hello world

官方提供了快速開始的手腳架,怎么方便怎么來。

https://github.com/atom/electron-quick-start

clone下來

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

git那些不是我們需要的,就刪掉。

安裝相關(guān)的依賴,推薦用yarn。

yarn https://yarn.bootcss.com/

cd 到 目錄下

cnpm install yarn
yarn

等待依賴安裝完成。

npm run start

順利的話就可以看到程序啟動。

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

界面編寫

準備完畢,開始進入正題。

用vscode打開文件夾,順帶一提,vscode也是基于electron。vscode不愧是巨硬出品,越來越好用了。

整理一下

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

這里就不累贅了。

后臺有多個小號要登錄,就寫個登錄頁面。

編輯一下index.html

<html>
<head>
 <meta charset="utf-8">
 <link  rel="external nofollow" rel="stylesheet">
</head>
<body>
 <div class="panel panel-default" >
  <div class="panel-body">
   <div class="form-horizontal" role="form">
    <div class="form-group">
     <label for="input_name" class="col-sm-2 control-label">登錄帳號</label>
     <div class="col-sm-10">
      <input type="text" class="form-control" id="input_name" placeholder="請輸入用戶名">
     </div>
    </div>
    <div class="form-group">
     <label for="input_pass" class="col-sm-2 control-label">登錄密碼</label>
     <div class="col-sm-10">
      <input type="password" class="form-control" id="input_pass" placeholder="請輸入登錄密碼">
     </div>
    </div>
    <div class="form-group">
     <label for="input_check" class="col-sm-2 control-label">驗證碼:</label>
     <div class="col-sm-6">
      <input type="text" class="form-control" id="input_check" placeholder="請輸入驗證碼">
     </div>
     <div class="col-sm-2">
      <img id="img_code" src="code.png" />
     </div>
    </div>
    <div class="form-group">
     <div class="col-sm-offset-2 col-sm-2">
      <button id="btn_submit" class="btn btn-default">登錄</button>
     </div>
     <div class="col-sm-2">
      <button id="btn_refresh" class="btn btn-default">刷新驗證碼</button>
     </div>
    </div>
   </div>
  </div>
 </div>
 <script>
  require('./index.js');
 </script>
</body>
</html>

都是些 很簡單的html代碼,為了好看的就用了bootstrap

electron可以調(diào)用bootstap、jquery ,方便開發(fā)。調(diào)用jq有個小小的坑,注意一下。

不過我這里不需要什么效果,就簡單點。

在vscode 快捷鍵 Ctrl + ` 調(diào)出 CMD 運行一下

npm run start

就可以看到我們剛剛寫的網(wǎng)頁了

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

下載驗證碼

登錄是需要驗證碼的,我們把驗證碼下載下來。

流程是 請求驗證碼網(wǎng)站,下載驗證碼保存到本地顯示,驗證碼的cookie保存下來,后面登錄時候需要用到cookie

安裝需要的依賴 superagent , fs-extra

編輯 main.js

const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow

const path = require('path')
const url = require('url')
// 爬蟲
const superagent = require('superagent');
// 操作文件
const fs = require('fs-extra');

let mainWindow
// 驗證碼的cookie
var codeCookie
// 驗證碼網(wǎng)址
const codeUrl = '驗證碼地址';
// 頭信息
const browserMsg = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
};

function createWindow() {
 mainWindow = new BrowserWindow({
  width: 800,
  height: 600
 })
 superagent
  .get(codeUrl)
  .set(browserMsg)
  .end((err, res) => {
   codeCookie = res.header['set-cookie']
   console.log('codeCookie: ' + codeCookie)
   // 驗證碼圖片保存到本地
   fs.outputFile(path.join(__dirname) + '/code.png', res.body, function (err) {})
  })
 mainWindow.loadURL(url.format({
  pathname: path.join(__dirname, 'index.html'),
  protocol: 'file:',
  slashes: true
 }))
 // 打開調(diào)試控制臺
 mainWindow.webContents.openDevTools()

 mainWindow.on('closed', function () {
  mainWindow = null
 })

}
app.on('ready', createWindow)

app.on('window-all-closed', function () {
 if (process.platform !== 'darwin') {
  app.quit()
 }
})

app.on('activate', function () {
 if (mainWindow === null) {
  createWindow()
 }
})

說一下安裝的依賴

fs-extra fs-extra模塊是系統(tǒng)fs模塊的擴展,提供了更多便利的 API,并繼承了fs模塊的 API。

主角就是 superagent https://www.npmjs.com/package/superagent

運行一下

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

很好,我們要的驗證碼和cookie 都有了。

分析登錄流程

用 Fiddler 抓包工具和瀏覽器的調(diào)試控制臺分析一下后臺的登錄。

這里不是重點就略過了。

Electron 通信

渲染進程(就是網(wǎng)頁) 登錄 需要 主進程保存的codeCookie ,這就要兩者進行通信。

Electron之間的通信是用ipc

主進程的是 ipcMain 也可以用 mainWindow.webContents來發(fā)送

渲染進程的是 ipcRenderer

這里演示一下 主進程發(fā)送cookie 給 渲染進程

main.js 文件

const ipcMain = electron.ipcMain;
ipcMain.on('notice', (e, msg) => {
 switch (msg) {
  case 'getcodeCookie':
   mainWindow.webContents.send('codeCookie',codeCookie)
   break
  default:
   break
 }
})

打開調(diào)試控制臺 可以看到輸出

index.js

const electron = require('electron');
const ipcRenderer = electron.ipcRenderer;
// 獲取控件
let btn_submit = document.getElementById("btn_submit");
btn_submit.addEventListener('click', (e) => {
  ipcRenderer.send('notice', 'getcodeCookie');
});
// 監(jiān)聽 codeCookie
ipcRenderer.on('codeCookie', (e, msg) => {
  codeCookie = msg;
  console.log('接受主進程發(fā)送的codeCookie: '+codeCookie);
});

運行一下, 點擊登錄按鈕

就可以在調(diào)試控制臺看到 codeCookie

用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法

模擬登錄

我們需要登錄后臺,獲取登錄后cookie這樣才方便我們操作。

編輯index.js

const electron = require('electron');
const ipcRenderer = electron.ipcRenderer;
const path = require('path');
const superagent = require('superagent');

// 鏈接
const urls = {
  loginUrl: "登錄的地址",
  codeUrl: "驗證碼地址",
  targetUrl: "后臺的地址"
};

// 頭信息
const browserMsg = {
  "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36",
  'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
};
// 驗證碼cookie
var codeCookie;
// 登錄后的cookie
var tokenCookie;

// 獲取控件
const btn_submit = document.getElementById("btn_submit");
const btn_refresh = document.getElementById("btn_refresh");
const input_name = document.getElementById("input_name");
const input_pass = document.getElementById("input_pass");
const input_code = document.getElementById("input_code");

// 登錄按鈕 點擊事件
btn_submit.addEventListener('click', (e) => {
  ipcRenderer.send('notice', 'getcodeCookie');
  // 獲取輸入文本
  var name = input_name.value;
  var pass = input_pass.value;
  var code = input_check.value;
  // 校驗輸入
  if (name == "" || pass == "" || code == "") {
    alert("請輸入");
  } else {
    // 校驗通過 開始進行登錄操作
    superagent
      .post(urls.loginUrl)
      .set('Cookie', codeCookie)
      .set(browserMsg)
      // 避免登錄后的302重定向
      .redirects(0)
      .send({
        'LoginForm[username]': name
      }).send({
        'LoginForm[password]': pass
      }).send({
        logincode: code
      }).send({
        jz: '0'
      }).end((err, res) => {
        // 登錄成功 獲取tokenCookie
        // 獲取tokenCookie
        tokenCookie = res.header['set-cookie'];
        superagent
          .get(urls.targetUrl)
          .set('Cookie',tokenCookie)
          .set(browserMsg)
          .end((err,res)=>{
            // 成功進入后臺
            console.log(res.text);
          })
      });
  }

});

btn_refresh.addEventListener('click', (e) => {

});

ipcRenderer.on('codeCookie', (e, msg) => {
  codeCookie = msg;
  console.log('接受主進程發(fā)送的codeCookie: ' + codeCookie);
});

這里只是演示一下代碼怎么寫,具體不一定那么順利的拿到tokenCookie。具體情況具體分析。

關(guān)鍵是請求要帶上cookie

數(shù)據(jù)抓取

成功進入到后臺了,就要抓取需要的數(shù)據(jù)了。這里就需要 cheerio 工具了

cheerio https://cheerio.js.org/

可以理解是node上jq , 操作基本跟jq是一樣的。

操作還是很簡單的。

要注意的是nodejs是異步的,就連for也是異步的。

有時候要等待請求完成的話,就要用上 async 了。

導出xlsx表格

爬蟲基本完成了,怎么導出數(shù)據(jù)就隨意了。

如果是要生成xls表格,一般是用excel-export 簡單夠用

我這里推薦 另一個 better-xlsx 。

這里演示一下 , 怎么調(diào)用系統(tǒng)的保存對話框,保存文件。

編輯 index.js

const remote = electron.remote;

btn_refresh.addEventListener('click', (e) => {

  const filepath =remote.dialog.showSaveDialog(remote.getCurrentWindow(), {
    // 過濾文件類型
    filters: [{
      name: "xls Files",
      extensions: ['xlsx']
    },
    {
      name: 'All Files',
      extensions: ['*']
    }
  ]
  });
  console.log(filepath);
});

運行一下,點擊刷新驗證碼按鈕就可以看到熟悉的系統(tǒng)對話框

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站標題:用Electron寫個帶界面的nodejs爬蟲的實現(xiàn)方法
網(wǎng)頁URL:http://jinyejixie.com/article34/jjhpse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、全網(wǎng)營銷推廣網(wǎng)站排名、關(guān)鍵詞優(yōu)化品牌網(wǎng)站制作、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
静海县| 定西市| 罗定市| 政和县| 邮箱| 黔江区| 保山市| 宣化县| 绥芬河市| 新野县| 高青县| 视频| 横峰县| 宁海县| 寻甸| 仁寿县| 孟州市| 吉水县| 科技| 项城市| 都昌县| 买车| 芦溪县| 卓尼县| 丹阳市| 白玉县| 沁水县| 青岛市| 新田县| 施甸县| 汉源县| 且末县| 徐汇区| 江山市| 兴和县| 嘉鱼县| 平南县| 托里县| 榆中县| 万源市| 宜昌市|