使用electorn开发google爬虫

electron介绍

最近接触到 electron 的开发,elctron基于NodeJs以及Chromium(可以看作是一个完整的chrome浏览器),这样就可以在nodejs环境下,开发html界面,并且通过electron提供的api使用本地计算机的资源,最后打包成一个应用程序,包括windows、linux、macos,三个平台兼容的应用程序,因为都是基于nodejs和Chromium,而他们包括electron的兼容都已经帮你做好了,直接用js写代码跑起来即可,最简单就是将一个网页(包含业务操作)打包成软件包。

爬虫工具nightmare介绍

nightmare 是基于electron开源出来的一个代码测试工具,也就是说模拟浏览器操作来测试你的代码,既然nightmare可以模拟浏览器操作,就突然想到是否能用它来模拟浏览器正常的浏览爬取数据,并且不需要研究协议、headers、cookie、ip等等,这些都不需要了,因为现在这就是一个普通的浏览器,当然频率过高还是会有一定的限制,经过一番搜索,nightmare本身并部支持在electron下再运行,但是!
有人fork了nightmare的源码,改出了一个可以在electron下运行的nightmare——eramthgin ,也就是说我们可以用js开发出一个带界面操作的爬虫软件!
理论上你能正常通过浏览器浏览的网站,他的内容你都可以通过nightmare进行获取,比如google,只要你的电脑可以正常访问就没有问题,electron默认就是chrome浏览器,默认代理就是使用的你的电脑设置的代理。

项目结构初始化

  1. 初始化项目
    electron项目基于electron-vue 的vue模板进行初始化,基本上帮你配好了熟悉的vue开发环境。
# 安装vue-cli 并初始化模板
npm install -g vue-cli
# 初始化项目的时候我没选 eslint,暂时跟我的vscode兼容没设置好
vue init simulatedgreg/electron-vue ele-crawler

package.json 修改,因为taobao没有2.0.10的镜像

devDependencies:{
    "electron": "^2.0.2"
}
// 修改为
devDependencies:{
    "electron": "2.0.9"
}
# 安装依赖运行
cd ele-crawler
# yarn安装比npm更快,设置淘宝镜像
yarn config set sass-binary-site http://npm.taobao.org/mirrors/node-sass
yarn config set ELECTRON_MIRROR https://npm.taobao.org/mirrors/electron
yarn config set registry https://registry.npm.taobao.org
# 安装如果报错的话,删掉node_modules文件夹,执行上面操作再安装,可解决99%的安装依赖报错问题
yarn
yarn run dev

现在electron-vue项目就跑起来了,系统会自动打开浏览器demo窗口。

  1. 安装nightmare
# 单独安装 nightmare,注意:包名不是nightmare,而是eramthgin
# 或者你也可以在package.json先手动增加 "eramthgin": "^2.9.3"
yarn add eramthgin

electron与nightmare开发

我们的目标是开发一个界面化的爬虫软件,那么就先做界面,做个最简单的。

界面修改

/src/renderer/components/LandingPage.vue

// 该vue文件的template里边的内容全部删除,只保留最外层的<div></div>
// 再在里边添加一个最简单的button
<template>
  <div id="wrapper">
    <button class="alt" @click="openbaidu">google爬虫</button>
  </div>
</template>

electron-vue项目默认已引用了electron的ipc通讯组件,我们直接引用即可
那么在methods里添加一个openbaidu方法

methods: {
      openbaidu(){
        // this.$electron.ipcRenderer可直接用来进行与主进程的ipc通信
        // 以下为向主进程发送一个google事件,在主进程里直接接受即可
        this.$electron.ipcRenderer.send('google')
      }
    }
主进程编写爬虫代码

我们需要做到2点

  • 其一,是在主进程中接收渲染进程发送过来的'google'事件,接收事件之后
    做对应的操作(开始爬页面)
  • 其二,需要将nightmare的代码进行封装,因为nightmare相当于一个实例化的对象,nightmare进程未结束之前不能对他做其他的操作,我们需要对他进行对象化,方便多个nightmare的控制(比如可以进行多个爬虫同时进行)
    以下均在 /src/main 目录下进行

新建 ipc.js

import {ipcMain} from 'electron'
import crawler from './crawler'

// 异步爬google
async function getGoogleList(webGoogle){
    try {
        // 以power bank关键字,并指定在www.amazon.com搜索
        let googleRes = await webGoogle.crawlerWeb('power bank','www.amazon.com')
        return googleRes
    } catch (e) {
        console.log("错误:" + JSON.stringify(e))
        await webGoogle.closeWeb()
    }
}
// google网站翻页
async function nexaPage(webGoogle){
    await webGoogle.nightmare
    .evaluate(()=>{
        return document.querySelector('#pnnext')
    })
    .wait(1000)
    .click('#pnnext')
}

ipcMain.on('google', (event) => {
    // 初始化nightmare对象
    const cra = new crawler()
    getGoogleList(cra)
    .then(async ()=>{
        // 模拟翻页,根据实际情况编写代码
        for (let index = 0; index < 1; index++) {
            try {
                await nexaPage(cra)
            } catch (error) {
                console.log(error)
                await cra.closeWeb()
            }
            console.log(`已完成第${index +1}页`)
        }
        // 完成之后关闭nighmare进程,否则下次无法重新运行
        await cra.closeWeb()
    })
})

新建 crawler.js

import Nightmare from 'eramthgin'

export default class crawler{
    constructor(show = true){
        // 初始化一个nightmare对象
        this.nightmare = Nightmare({
            show: show, //是否显示爬虫窗口
            gotoTimeout: 10000
        })
    }
    // nightmare调用,设置为async方法
    async crawlerWeb(typeContent="power bank",site="",url= "https://www.google.com",typeSelector="body",clickSelector=".jhp input[name='btnK']",wait=1000){
        let queryText = this.getQueryText(typeContent,site)
        return this.nightmare
        .goto(url)
        .type(typeSelector, queryText)
        .wait(wait)
        // 模拟enter键
        .type('body','\u000d')
        .wait(wait)
        .evaluate(()=> {
            let data = document.querySelector('#ires').innerHTML
            return data
        })
    }
    // 获取查询关键字,是否在指定网站搜索(site: www.amazon.com)
    getQueryText(typeContent,site){
        let queryText = ""
        if(site == ""){
            queryText = typeContent
        }else{
            queryText = `${typeContent} site:${site}`
        }
        return queryText
    }
    // 关闭当前渲染进程
    async closeWeb(){
        await this.nightmare.end()
    }
}

index.js

// 在任意地方引用ipc.js,建议与文件的import放在一起,方便管理
import { app, BrowserWindow } from 'electron'
require('./ipc.js')
测试

eletron-vue项目在dev环境开启了热更新,在修改完代码之后,界面上只有一个测试按钮,
点击按钮,会再自动弹出一个窗口,自动输入google的域名,自动输入关键字,自动点击查询,并且自动翻页。


google爬虫
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489...
    秋玄语道阅读 13,705评论 3 116
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,144评论 0 1
  • awesome-github-vue 是由OpenDigg[https://blog.csdn.net/opend...
    我是七月阅读 2,400评论 0 20
  • 昨天真真太忙了,上床睡觉,发现已经忘记更新,只能道歉了,而且实在也睁不开眼睛写,因为周末加了两天班,而且去库房帮忙...
    我就是圆圆阅读 149评论 0 0
  • 黑猴和瓜姐 瓜姐原名叫地瓜,是一只德国牧羊犬,飞机场警犬的后代。瓜姐长相威武,性格却像个小媳妇,在家里除了外...
    老土的蜜罐子阅读 285评论 0 0