当前位置:   article > 正文

可视化爬虫配置chrome插件开发之搭建vue开发环境

chrome.runtime.getpackagedirectoryentry

使用vue开发chrome插件的好处

本次开发的插件是抓取配置插件,有很多的form表单以及弹出层,如果纯使用js的话会有很多动态创建dom的操作。使用vueES6import语法以及webpackhtml加载器相配合,可以减少大量动态创建dom的代码。

vue环境搭建

工作准备

  • 请安装node.js(新版自带npm包管理工具)
  • 建议安装cnpm淘宝镜像,安装依赖的时候会更快一些
  1. # -g 安装在全局 registry指定国内下载地址
  2. $ npm install cnpm -g --registry=https://registry.npm.taobao.org

npmcnpm 基本等价,但是很少情况下cnpm也许有些bug,所以请斟酌使用

安装vue-cli 这是vue的脚手架,可以很方便的为我们搭建一个vue项目

$ npm install vue-cli -g

其他更详细的vue使用方法这里不细讲,参见vue官方文档

脚手架创建

打开命令行,进入到你的工作空间,我们使用vue脚手架来搭建项目

  1. # 创建一个基于 `webpack` 模板的新项目
  2. $ vue init webpack chromespidercfg
  3. # 创建过程会要求你的项目起名(**注意现在项目名不支持驼峰式命名**)之类,由于是简单的页面,所以vue-router之类的就不装了,后面有我的运行截图
  4. $ cd chromespidercfg
  5. $ cnpm install
  6. $ npm run dev

访问页面 localhost:8080 出来页面了就算成功了,Ctrl + C y确认退出
下面是我创建项目的截图:

clipboard.png

配置

如果你想要使用 vue开发单页面程序,那么这个页面已经搭建好了,但是我们要做的是 chrome插件开发,所以还需要做一些配置
chrome插件必要文件
chrome开发需要一些必要的文件,比如 manifest.json,我们要创建一下

在目录下创建chrome文件夹,名字随便起,我在这里起名叫chrome是因为我的vue编译配置中用的是这个名字,现在的目录结构如下:

clipboard.png

现在进入刚刚创建的chrome目录,创建一个manifest.json文件和runbackground.min.js文件,以及一个icons文件夹,这个icons文件夹是放图标的,chrome文件夹结构如下:

clipboard.png

manifest.json文件就是插件的主要配置了,具体的配置可以查看我的另一篇文章爬虫可视化点选配置工具之chrome插件简介,如下:

  1. {
  2. "background": {
  3. "scripts": ["runbackground.min.js"]
  4. },
  5. "browser_action": {
  6. "default_icon": "./icons/icon.png",
  7. "default_title": "简单爬,简简单单采集你的数据"
  8. },
  9. "content_scripts": [{
  10. "js": ["js/connector.js"],
  11. "matches": ["http://*/*", "https://*/*"]
  12. }],
  13. "externally_connectable": {
  14. "accepts_tls_channel_id": false,
  15. "ids": ["*"]
  16. },
  17. "icons": {
  18. "128": "./icons/128.png",
  19. "16": "./icons/16.png",
  20. "48": "./icons/48.png"
  21. },
  22. "description": "爬虫可视化点选配置工具,简简单单采集你的数据",
  23. "manifest_version": 2,
  24. "name": "爬虫可视化点选配置工具",
  25. "permissions": ["cookies", "tabs", "notifications", "background", "contextMenus", "*://*/*"],
  26. "version": "1.0.0",
  27. "web_accessible_resources": ["*", "*/*"]
  28. }

runbackground.min.js这个里面写了一些启动插件的逻辑,很简单,如下:

  1. chrome.runtime.getPackageDirectoryEntry(function(info) {
  2. extensionId = info.filesystem.name.split('_')[1];
  3. });
  4. /*
  5. 插件启动,创建爬虫任务
  6. */
  7. chrome.browserAction.onClicked.addListener(function(tab) {
  8. chrome.tabs.sendMessage(tab.id, JSON.stringify({
  9. command: 'beginUI'
  10. }), function(msg) {
  11. chrome.tabs.executeScript(tab.id, {
  12. file: 'js/paApa.js',
  13. allFrames: false
  14. })
  15. });
  16. });
  17. chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
  18. var msg = JSON.parse(message);
  19. console.log(msg);
  20. });

修改webpack配置

写到这里,大家一定很奇怪 manifest.json文件里的 js/connector.js是哪里来的,明明没有js目录啊,这就是 webpack编译出来

修改build目录下的webpack.base.conf.js文件,去掉所有limit字段
entry字段修改成以下内容,这就是编译之后的文件

  1. entry: {
  2. paApa: './src/main.js',
  3. connector: './src/js/connector.js'
  4. }

modulerules添加以下内容,一个是加载css的,一个是加载html的:

  1. {
  2. test: /\.css$/,
  3. use: [
  4. 'style-loader',
  5. 'css-loader'
  6. ]
  7. },
  8. {
  9. test: /\.html$/,
  10. use: [{
  11. loader: 'html-loader'
  12. }],
  13. }

webpack.prod.conf.js文件修改成以下内容,为什么要这么改请自行查看webpack的资料吧:

  1. 'use strict'
  2. const path = require('path')
  3. const utils = require('./utils')
  4. const webpack = require('webpack')
  5. const config = require('../config')
  6. const merge = require('webpack-merge')
  7. const baseWebpackConfig = require('./webpack.base.conf')
  8. const CopyWebpackPlugin = require('copy-webpack-plugin')
  9. const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
  10. const env = require('../config/prod.env')
  11. const webpackConfig = merge(baseWebpackConfig, {
  12. devtool: config.build.productionSourceMap ? config.build.devtool : false,
  13. output: {
  14. path: config.build.assetsRoot,
  15. filename: utils.assetsPath('js/[name].js'),
  16. chunkFilename: utils.assetsPath('js/[id].js')
  17. },
  18. plugins: [
  19. new webpack.ProvidePlugin({
  20. $: "jquery",
  21. jQuery: "jquery"
  22. }),
  23. // http://vuejs.github.io/vue-loader/en/workflow/production.html
  24. new webpack.DefinePlugin({
  25. 'process.env': env
  26. }),
  27. new UglifyJsPlugin({
  28. uglifyOptions: {
  29. compress: {
  30. warnings: false
  31. }
  32. },
  33. sourceMap: config.build.productionSourceMap,
  34. parallel: true
  35. }),
  36. // keep module.id stable when vendor modules does not change
  37. new webpack.HashedModuleIdsPlugin(),
  38. // enable scope hoisting
  39. new webpack.optimize.ModuleConcatenationPlugin(),
  40. // copy custom static assets
  41. new CopyWebpackPlugin([{
  42. from: path.resolve(__dirname, '../chrome'),
  43. to: config.build.assetsSubDirectory,
  44. ignore: ['.*']
  45. }])
  46. ]
  47. })
  48. if (config.build.productionGzip) {
  49. const CompressionWebpackPlugin = require('compression-webpack-plugin')
  50. webpackConfig.plugins.push(
  51. new CompressionWebpackPlugin({
  52. asset: '[path].gz[query]',
  53. algorithm: 'gzip',
  54. test: new RegExp(
  55. '\\.(' +
  56. config.build.productionGzipExtensions.join('|') +
  57. ')$'
  58. ),
  59. threshold: 10240,
  60. minRatio: 0.8
  61. })
  62. )
  63. }
  64. if (config.build.bundleAnalyzerReport) {
  65. const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  66. webpackConfig.plugins.push(new BundleAnalyzerPlugin())
  67. }
  68. module.exports = webpackConfig

修改config\index.js文件,删除build字段下的index字段,将assetsSubDirectory字段值修改为chrome,这就会将上面创建的chrome拷贝到编译后的目录中

修改完配置,还要安装几个插件,分别是html和css加载器,以及jquery:

npm install html-loader style-loader jquery -D

到此为止,环境基本上搭建完成了,下面就是写代码了

编写基本的代码框架

由于插件中主要用到了弹出层,我这里用的是layer.js,当然是修改过的,支持ES6的导入和导出,layer.csslayer.js,当然也可以自己写一个或者使用其他的弹出层组件
进入src目录,修改main.js为以下内容,作用就是打开一个弹出层

  1. import Vue from 'vue';
  2. import $ from "jquery";
  3. import './layer/layer.css';
  4. import layer from './layer/layer';
  5. Vue.config.productionTip = false;
  6. let _confirmLayer = 0;
  7. let windowHeight = $(window).height();
  8. if (windowHeight > window.screen.height) {
  9. windowHeight = document.body.clientHeight;
  10. }
  11. let defOption = {
  12. type: 1,
  13. shade: false,
  14. maxmin: true,
  15. closeBtn: 1,
  16. zIndex: 2147483599,
  17. title: "爬虫可视化点选配置工具",
  18. offset: ["30px", "30px"],
  19. content: '<div id="__paApa_container"></div>',
  20. area: ["450px", windowHeight * 0.8 + "px"],
  21. cancel: function(index) {
  22. event.stopPropagation();
  23. if (_confirmLayer > 0) {
  24. layer.close(_confirmLayer);
  25. }
  26. _confirmLayer = layer.confirm(
  27. "关闭爬虫可视化点选配置工具?", {
  28. icon: 0,
  29. title: "信息",
  30. zIndex: 2147483615
  31. },
  32. function(_index) {
  33. event.stopPropagation();
  34. layer.closeAll();
  35. _confirmLayer = -1;
  36. layer.msg("再见!", {
  37. zIndex: 2147483620,
  38. time: 3000,
  39. icon: 1
  40. });
  41. },
  42. function(_index) {
  43. event.stopPropagation();
  44. layer.close(_index);
  45. _confirmLayer = -1;
  46. }
  47. );
  48. return false;
  49. }
  50. };
  51. let layerId = layer.open(defOption);
  52. $("#layuiex-layer" + layerId + " .layuiex-layer-max").bind("click", function() {
  53. $(this).hide();
  54. }).hide();
  55. $("#layuiex-layer" + layerId + " .layuiex-layer-min").bind("click",
  56. function() {
  57. $(this).next().show();
  58. }
  59. );
  60. new Vue({
  61. el: "#__paApa_container",
  62. components: {},
  63. data() {
  64. return {};
  65. },
  66. mounted() {},
  67. methods: {}
  68. });

上面还提到了connector.js这个文件,这个文件的作用其实就是作为通信用的,现在可以在js目录下创建一个connector.js文件,然后随便输出个内容就可以了

安装测试

完成以上步骤就可以测试一下了

在根目录执行以下命令:

npm run build

出现下图就证明已经执行成功了

clipboard.png

此时跟目录中会多一个dist目录,这就是执行的结果,然后打开chrome浏览器安装插件就可以了,打开插件管理页面,具体操作请查看爬虫可视化点选配置工具之chrome插件简介,然后打开开发者模式,再点击加载已解压的扩展程序,如下图:

clipboard.png

之后再选择dist目录中的chrome文件夹即可,如下图:

clipboard.png

安装成功的话会在插件列表看到下图:

clipboard.png

chrome工具栏也会有对应的插件图标:

clipboard.png

此时打开一个其他页面点击这个图标就会弹出我们要的框了,如下图:

clipboard.png

现在基本的框架已经搭建好了,之后要做的就是在这个弹出框里绘制输入框等元素了,这个步骤下回再分解了

以上源码放在码云,请自行查看吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/915411
推荐阅读
相关标签
  

闽ICP备14008679号