亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

用Electron寫個帶界面的nodejs爬蟲的實現方法

2019-11-19 12:11:45
字體:
來源:轉載
供稿:網友

什么是Electron

使用 JavaScript, HTML 和 CSS 構建跨平臺的桌面應用

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

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

前言

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

準備工作

安裝nodejs

npm安裝electron(最好換成cnpm,不然可能失敗)

hello world

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

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

clone下來

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

安裝相關的依賴,推薦用yarn。

yarn https://yarn.bootcss.com/

cd 到 目錄下

cnpm install yarnyarn

等待依賴安裝完成。

npm run start

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

界面編寫

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

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

整理一下

這里就不累贅了。

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

編輯一下index.html

<html><head> <meta charset="utf-8"> <link  rel="external nofollow" rel="stylesheet"></head><body> <div class="panel panel-default" style="margin: 10px">  <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可以調用bootstap、jquery ,方便開發。調用jq有個小小的坑,注意一下。

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

在vscode 快捷鍵 Ctrl + ` 調出 CMD 運行一下

npm run start

就可以看到我們剛剛寫的網頁了

下載驗證碼

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

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

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

編輯 main.js

const electron = require('electron')const app = electron.appconst BrowserWindow = electron.BrowserWindowconst path = require('path')const url = require('url')// 爬蟲const superagent = require('superagent');// 操作文件const fs = require('fs-extra');let mainWindow// 驗證碼的cookievar codeCookie// 驗證碼網址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 })) // 打開調試控制臺 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模塊是系統fs模塊的擴展,提供了更多便利的 API,并繼承了fs模塊的 API。

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

運行一下

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

分析登錄流程

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

這里不是重點就略過了。

Electron 通信

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

Electron之間的通信是用ipc

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

渲染進程的是 ipcRenderer

這里演示一下 主進程發送cookie 給 渲染進程

main.js 文件

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

打開調試控制臺 可以看到輸出

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');});// 監聽 codeCookieipcRenderer.on('codeCookie', (e, msg) => {  codeCookie = msg;  console.log('接受主進程發送的codeCookie: '+codeCookie);});

運行一下, 點擊登錄按鈕

就可以在調試控制臺看到 codeCookie

模擬登錄

我們需要登錄后臺,獲取登錄后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'};// 驗證碼cookievar codeCookie;// 登錄后的cookievar 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('接受主進程發送的codeCookie: ' + codeCookie);});

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

關鍵是請求要帶上cookie

數據抓取

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

cheerio https://cheerio.js.org/

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

操作還是很簡單的。

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

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

導出xlsx表格

爬蟲基本完成了,怎么導出數據就隨意了。

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

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

這里演示一下 , 怎么調用系統的保存對話框,保存文件。

編輯 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);});

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品久久久久久久| 国产视频精品一区二区三区| 欧美电影免费观看电视剧大全| 78m国产成人精品视频| 亚洲视频欧洲视频| 最新亚洲国产精品| 深夜福利日韩在线看| 日韩视频―中文字幕| 2024亚洲男人天堂| 91免费在线视频网站| 国产精品小说在线| 国产精品美女www爽爽爽视频| 91丨九色丨国产在线| 成人av色在线观看| 中文字幕精品国产| 日本一欧美一欧美一亚洲视频| 国产成人a亚洲精品| 欧美激情久久久久久| 久久久久亚洲精品成人网小说| 欧美成人免费va影院高清| 日韩免费观看视频| 国语自产精品视频在线看一大j8| 日韩精品久久久久| 欧美日韩国产在线| 久久影院资源站| 国产精品久久婷婷六月丁香| 欧美电影院免费观看| 亚洲欧美日韩国产精品| 国产日韩在线亚洲字幕中文| 久久久精品久久| 国产在线观看91精品一区| 国产精品视频免费观看www| 亚洲欧美综合区自拍另类| 欧美性猛交xxxx黑人猛交| 精品国产一区二区三区四区在线观看| 国内精品久久久久久| 精品视频中文字幕| 成人h视频在线观看播放| 欧美成人久久久| xxx欧美精品| 欧美亚洲国产视频| 91av免费观看91av精品在线| 中文字幕久久久| 国产在线视频不卡| 久久成人亚洲精品| 欧美性猛交xxxx富婆弯腰| 欧美电影免费看| 日韩在线观看免费全| 国产午夜精品视频免费不卡69堂| 欧美视频免费在线| 国产精品69av| 91精品综合视频| 国产精品视频成人| xxx成人少妇69| 国产ts人妖一区二区三区| 亚洲一区免费网站| 亚洲女人被黑人巨大进入| 久久久久中文字幕2018| 91av在线不卡| 亚洲一区二区免费| 福利二区91精品bt7086| 成人妇女免费播放久久久| 亚洲国产精品999| 亚洲图片欧洲图片av| 波霸ol色综合久久| 成人精品网站在线观看| 亚洲精品在线观看www| 亚洲国产天堂久久综合网| 91色中文字幕| 日韩精品免费在线观看| 国外成人在线直播| 国产精品免费视频久久久| 欧美日韩视频免费播放| 成人网址在线观看| 欧美激情免费在线| 久久91精品国产91久久跳| 午夜精品久久久久久久99热| 91亚洲va在线va天堂va国| 九色精品美女在线| 久久久久久尹人网香蕉| 亚洲高清一二三区| 日韩av影院在线观看| 亚洲男人天堂网| 青青草99啪国产免费| 97在线视频一区| 国产成人精品电影久久久| 欧美日韩亚洲一区二| 欧美激情视频免费观看| 欧美激情一区二区三区成人| 国产精品电影网| 亚洲性日韩精品一区二区| 国产精品电影在线观看| 亚洲精品在线视频| 国产精品国产三级国产aⅴ浪潮| 亚洲天堂av在线播放| 欧美日韩一区二区在线播放| 亚洲欧美中文日韩在线v日本| 亚洲无av在线中文字幕| 国产精品a久久久久久| 久久在线视频在线| 日本欧美精品在线| 日韩中文理论片| 国产成人小视频在线观看| 国产精品青草久久久久福利99| 日韩中文字幕不卡视频| 中文字幕亚洲一区在线观看| 韩国日本不卡在线| 国产成人一区二区三区电影| 91久久在线观看| 久久久91精品| 精品国产欧美一区二区五十路| 国产欧美精品日韩| 欧美日韩一区二区免费视频| 热草久综合在线| 欧美亚洲国产日本| 精品久久香蕉国产线看观看gif| 色综合男人天堂| 亚洲精品免费在线视频| 欧美成人一区二区三区电影| 丝袜亚洲欧美日韩综合| 精品国产999| 国产精品久久在线观看| 国产成人涩涩涩视频在线观看| 亚洲人成电影网站色…| 欧美韩国理论所午夜片917电影| 欧美性xxxxxxx| 中文字幕日韩在线视频| 亚洲第一页在线| 97视频在线观看播放| 国产成人一区二区三区电影| 欧美www视频在线观看| 亚洲人成亚洲人成在线观看| 韩国福利视频一区| 91香蕉嫩草影院入口| 日本国产欧美一区二区三区| 久久精品国产久精国产一老狼| 亚洲乱码国产乱码精品精天堂| 欧美日韩国产丝袜另类| 日本一区二区三区四区视频| 操日韩av在线电影| 亚洲第一网站免费视频| 亚洲bt欧美bt日本bt| 国产日韩换脸av一区在线观看| 欧美成人精品激情在线观看| 日韩精品欧美国产精品忘忧草| 国产精品91免费在线| 精品久久中文字幕久久av| 日韩在线不卡视频| 成人亚洲欧美一区二区三区| 一区二区三区在线播放欧美| 色无极亚洲影院| 亚洲精品电影网在线观看| 国产精品成人一区二区| 国产精品自产拍在线观看中文| 九九视频这里只有精品| 性欧美xxxx交| 欧美精品午夜视频| 92福利视频午夜1000合集在线观看| 欧美性猛交xxx| 成人激情视频免费在线| 国产亚洲一区二区精品| 日韩欧美在线播放| 国产精品日韩电影| 久久精品人人爽|