提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、对webscraper0.2.0.18的修改
  • 二、对0.3.6版本的修改
    • 1.导入
    • 2.修正报错
    • 3.特殊版本
  • 三、对0.6.4版本的修改
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

对webscraper中SelectorElementScroll部分改进,使其先滚动到底部加载全部网页,再读出所有数据。
因Firefox浏览器加载自己写的扩展程序需要审批,因此使用360浏览器加载改写的扩展,QQ浏览器中部分功能不能正常运行,其他浏览器未尝试。


提示:本代码在360浏览器中执行通过

一、对webscraper0.2.0.18的修改

该版本中SelectorElementScroll正好处于script/Selector文件夹下,文件结构较简单,但官方初始版本在执行上就发现有些浏览器不兼容,因此后面对更高版本也做了修改。

var SelectorElementScroll = {canReturnMultipleRecords: function () {return true;},canHaveChildSelectors: function () {return true;},canHaveLocalChildSelectors: function () {return true;},canCreateNewJobs: function () {return false;},willReturnElements: function () {return true;},scrollToBottom: function() {window.scrollTo(0,document.documentElement.scrollHeight);//console.log(document.documentElement.scrollTop+";"+document.documentElement.clientHeight+","+document.documentElement.scrollHeight);},scrollToTop: function() {var step=50;if(document.documentElement.scrollTop>step){window.scrollTo(document.documentElement.scrollTop,document.documentElement.scrollTop-step);}else{window.scrollTo(document.documentElement.scrollTop,0);}},_getData: function (parentElement) {var delay = parseInt(this.delay) || 0;var deferredResponse = $.Deferred();var foundElements = [];var lastHeight=0;var isTouchBottom=false;// initially scroll down and waitthis.scrollToBottom();var nextElementSelection = (new Date()).getTime()+delay;var begin = nextElementSelection;// infinitely scroll down and find all itemsvar interval = setInterval(function() {var now = (new Date()).getTime();// sleep. wait when to extract next elementsif(now < nextElementSelection) {clearInterval(interval);return;}/*if(now - begin > 10000){clearInterval(interval);alert("now-begin");return;}*/var elements = this.getDataElements(parentElement);// quick find max bottomif(!isTouchBottom && lastHeight!=document.documentElement.scrollHeight) {// continue scrolling and add delaylastHeight=document.documentElement.scrollHeight;foundElements = elements;this.scrollToBottom();nextElementSelection = now+delay;      //alert('step1;now:='+now+'nextElementSelection ='+nextElementSelection);// check max bottom//}else if(!isTouchBottom && lastHeight==document.documentElement.scrollHeight) {}else if(!isTouchBottom &&now - begin > 10000){isTouchBottom=true;foundElements = elements;this.scrollToTop();nextElementSelection = now+delay;//alert('step2;scrollTop='+document.documentElement.scrollTop);// smooth up to load pic}else if(isTouchBottom && document.documentElement.scrollTop!=0){foundElements = elements;this.scrollToTop();nextElementSelection = now+delay;//alert('step3;scrollTop='+document.documentElement.scrollTop);// check top}else if(isTouchBottom && document.documentElement.scrollTop==0){clearInterval(interval);deferredResponse.resolve(jQuery.makeArray(elements));//alert('step4;scrollTop='+document.documentElement.scrollTop);}}.bind(this), 50);return deferredResponse.promise();},getDataColumns: function () {return [];},getFeatures: function () {return ['multiple', 'delay']}
};

二、对0.3.6版本的修改

1.导入

导入src目录,先修改其中的manifest.json文件,完善插件名称、版本号等。
代码如下(示例):

2.修正报错

要点2:
引用模块必须在json中声明类型"type"="module"或在html中添加type=“module”,否则无法识别

Uncaught SyntaxError: Cannot use import statement outside a module

如:

<script type="module" src="/public/portis.js"></script>

 "background": {"page": "./background/background.html","type": "module"},

要点3:
导入的模块文件地址前不能省略/(根文件夹)或./(本文件夹)或…/(上层文件夹),须按照规范

Uncaught TypeError: Failed to resolve module specifier "mymodule.js". Relative references must start with either "/",

如:

import * as browser from "../webextension-polyfill/browser-polyfill.min.js";
import Config from '../scripts/Config';
import StorePouchDB from '../scripts/StorePouchDB';
import StoreRestApi from '../scripts/StoreRestApi';
import Sitemap from '../scripts/Sitemap';
import Queue from '../scripts/Queue';
import ChromePopupBrowser from '../scripts/ChromePopupBrowser';
import Scraper from '../scripts/Scraper';
import getBackgroundScript from '../scripts/BackgroundScript';

3.特殊版本

发现GitHub上下载的版本是第三方修改版本,与官网下载版本不符,格式也不对应,修改此版本任务终止。


三、对0.6.4版本的修改

从0.2.1版本后采用ES6语法重写,之后所有版本都在此基础上迭代,因此我修改了最新版本。ES6语法一开始有些难以理解,因此是模仿着改写。

主要修改部分为background_script.js和content_script.js两个文件,注意devtools_panel.js也包含与background.js相同的代码,但修改devtools_panel.js是无效的。

background_script.js的#16095行是SelectorElementScroll部分

function(e, t, i) {"use strict";var n = this && this.__awaiter || function(e, t, i, n) {return new (i || (i = Promise))((function(r, a) {function o(e) {try {c(n.next(e));} catch (e) {a(e);}}function s(e) {try {c(n.throw(e));} catch (e) {a(e);}}function c(e) {var t;e.done ? r(e.value) : (t = e.value, t instanceof i ? t : new i((function(e) {e(t);}))).then(o, s);}c((n = n.apply(e, t || [])).next());}));}, r = this && this.__await || function(e) {return this instanceof r ? (this.v = e, this) : new r(e);}, a = this && this.__asyncGenerator || function(e, t, i) {if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");var n, a = i.apply(e, t || []), o = [];return n = {}, s("next"), s("throw"), s("return"), n[Symbol.asyncIterator] = function() {return this;}, n;function s(e) {a[e] && (n[e] = function(t) {return new Promise((function(i, n) {o.push([ e, t, i, n ]) > 1 || c(e, t);}));});}function c(e, t) {try {(i = a[e](t)).value instanceof r ? Promise.resolve(i.value.v).then(l, u) : d(o[0][2], i);} catch (e) {d(o[0][3], e);}var i;}function l(e) {c("next", e);}function u(e) {c("throw", e);}function d(e, t) {e(t), o.shift(), o.length && c(o[0][0], o[0][1]);}};Object.defineProperty(t, "__esModule", {value: !0}), t.SelectorElementScroll = void 0;const o = i(10);class s extends o.Selector {constructor(e) {super(), this.type = "SelectorElementScroll", this.selector = "", this.multiple = !0, this.delay = 2e3, this.scrollElementSelector = "", this.updateData(e);}canReturnMultipleRecords() {return !0;}canHaveChildSelectors() {return !0;}canCreateNewJobs() {return !1;}willReturnElements() {return !0;}scrollToBottomIm(e) {return n(this, void 0, void 0, (function*() {e.element;this.scrollElementSelector, yield e.scrollDownBodyIm();}));}scrollToBottom(e, t = !1) {return n(this, void 0, void 0, (function*() {const i = e.element;if (this.scrollElementSelector) {const n = yield e.getElement(this.scrollElementSelector);if (!n) return;yield e.scrollDownElement(i, this.selector, t, n.element);} else yield e.scrollDownBody(i, this.selector, t);}));}scrollToTop(e) {return n(this, void 0, void 0, (function*() {e.element;this.scrollElementSelector, yield e.srcollBodyToTop();}));}_getData(e) {return a(this, arguments, (function*() {yield r(this.waitDelay()), yield r(this.scrollToTop(e));const t = parseInt("" + this.delay, 10) || 0;let i = yield r(this.getDataElements(e)), n = i.length;for (;;) {if (yield r(this.scrollToBottomIm(e)), yield r(e.webPage.waitForPageLoadComplete(!1, t)), i = yield r(this.getDataElements(e)), i.length === n && (yield r(this.scrollToTop(e)), yield r(this.scrollToBottom(e, !0)), yield r(e.webPage.waitForPageLoadComplete(!1, t)), i = yield r(this.getDataElements(e)), i.length === n) && (yield r(this.scrollToTop(e)), yield r(this.scrollToBottom(e, !0)), yield r(e.webPage.waitForPageLoadComplete(!1, t)), i = yield r(this.getDataElements(e)), i.length === n)) {for (const e of i) yield yield r(e);return yield r(void 0);}n = i.length;}}));}getDataColumns() {return [];}getFeatures() {return [ "selector", "multiple", "delay", "scrollElementSelector" ];}getExperimentalFeatures() {return [ "scrollElementSelector" ];}}t.SelectorElementScroll = s;
}

注意#50477和#50918行做了函数传递
#50477

     scrollDownBody(e, t, i = !1) {return n(this, void 0, void 0, (function*() {return this.sendMessage("scrollDownBody", [ e, t, i ]);}));}srcollBodyToTop() {return n(this, void 0, void 0, (function*() {return this.sendMessage("srcollBodyToTop");}));}

#50918

        srcollBodyToTop() {return n(this, void 0, void 0, (function*() {yield this.contentScriptClient.srcollBodyToTop();}));}scrollDownBodyIm() {return n(this, void 0, void 0, (function*() {yield this.contentScriptClient.scrollDownBodyIm();}));}

content-script.js中

#2135

            scrollElementToTop(e) {return r(this, void 0, void 0, (function*() {const t = this.elementReferences.getElementByReference(e);yield s.ScrollDown.scrollElementToTop(t);}));}srcollBodyToTop() {return r(this, void 0, void 0, (function*() {yield s.ScrollDown.scrollElementToTop(window);}));}scrollElementToBottomIm(e) {return r(this, void 0, void 0, (function*() {const t = this.elementReferences.getElementByReference(e);yield s.ScrollDown.scrollElementToBottomIm(t);}));}scrollDownBodyIm() {return r(this, void 0, void 0, (function*() {yield s.ScrollDown.scrollElementToBottomIm(window);}));}

#2856

            static scrollElementToTop(e) {return r(this, void 0, void 0, (function*() {0 !== o.getElementScrollYPosition(e) && (yield o.scrollToY(0, e));}));}static scrollElementToBottomIm(e) {return r(this, void 0, void 0, (function*() {document.documentElement.scrollTop !== o.getElementScrollYPosition(e) && (yield o.scrollToY(0, e));}));}

总结

通过自己改写浏览器插件大幅提高工作效率,修改该浏览器插件需要补充JS(ES6)方面知识,ES6的难度较高,不太容易上手。

webscraper改写案例分析相关推荐

  1. 崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

    2013数据库大会:崔华-基于Oracle的SQL优化案例分析 崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待. 2013年中国数据库技术大会第二天的"Oracle ...

  2. Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略

    Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3)).安装.学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略 ...

  3. MYSQL——索引设计原则与案例分析

    摘要 B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护.假如表中 R1~R5 的 (ID,k) 值分别为 (100,1).(200,2).(300,3).(500,5) 和 (600,6) ...

  4. 北航软工-软件案例分析-IT问答平台

    项目 内容 这个作业属于哪个课程 2023 年北航软件工程 这个作业的要求在哪里 个人作业-软件案例分析 我在这个课程的目标是 学习软件开发方法,了解并实践一些软件工程的方法论和工具,积累以结对编程和 ...

  5. pandas案例分析

    pandas案例分析 1 需求 现在我们有一组从2006年到2016年1000部最流行的电影数据 数据来源:https://www.kaggle.com/damianpanek/sunday-eda/ ...

  6. Java多线程:线程8锁案例分析

    线程8锁案例分析 通过分析代码,推测打印结果,并运行代码进行验证 1.两个线程调用同一个对象的两个同步方法 被synchronized修饰的方法,锁的对象是方法的调用者.因为两个方法的调用者是同一个, ...

  7. R语言Logistic回归模型案例:分析吸烟、饮酒与食管癌的关系

    R语言Logistic回归模型案例:分析吸烟.饮酒与食管癌的关系 目录 R语言Logistic回归模型案例分析吸烟.饮酒与食管癌的关系 #样例数据

  8. 计算机两个硬盘无法重启,双硬盘电脑非系统盘硬盘盘符重启丢失的案例分析

    原标题:双硬盘电脑非系统盘硬盘盘符重启丢失的案例分析 昨晚,小编在工作了一段时间之后,重新启动计算机,突然发现两个数据盘分区没了,从计算机的磁盘管理里面看,硬盘分区还在,盘符没了.如下图所示: 我的计 ...

  9. 案例分析 | SAP如何帮助企业实现端到端的数字化供应链管理

    https://www.toutiao.com/a6687387597922107916/ 在我之前的一篇 <收藏 | 供应链管理最佳实践之S&OP> 文章中,为大家介绍了关于S& ...

最新文章

  1. PYTHON学习笔记-DAY-16
  2. 一线大厂!真实!近距离!接触大数据时代
  3. 20100412 最近在看加密解密
  4. python正则表达式判断数字_Python机器学习之手写数字辨识及正则表达式
  5. springmvc 拦截器_Spring MVC拦截器学习
  6. VMware 8.0不能手动安装Linux5.5(命令行)问题解决方法
  7. 支付宝五福开奖!几个亿的项目你分到几块?
  8. 截取json字符串算法
  9. php火的原因,重燃你的PHP安全之火
  10. 【免费毕设】ASP.NET公交车管理系统的实现与设计(源代码+lunwen)
  11. RobotFramework中实现接口上传文件
  12. 【Unity游戏开发基础】如何做可以调整音量的UI滚动条组件
  13. 深度学习笔记:随机种子的作用
  14. CLRC66301国产替代,国产首颗全协议NFC芯片,可兼容A卡,B卡,F卡,15693卡,KK量级出货。
  15. 龙卷风代码html,龙卷风旋涡.html
  16. 李宏毅2020机器学习笔记2——CXK
  17. Spring Boot报错Description: A component required a bean of type 'com.rsjs.mapper.UserMapper' that cou
  18. ViewPager+Fragment实现页卡切换
  19. mac电脑如何导入ps笔刷 ,Adobe Photoshop笔刷导入安装教程详解
  20. php 打开文件方式

热门文章

  1. [blockchain-042]eos 硅谷ecs docer编译 mongo存储
  2. docer 设置 拉取http协议的私有仓库
  3. 【Android -- 架构】MVP 模式
  4. 计算机网络广东海洋大学简答题,广东海洋大学计算机网络历年考题(直接阅读版6套可编辑)...
  5. 如何在ps添加箭头_如何给图片加箭头?利用ps画箭头(任意角度),照着学就行了...
  6. C#串口开发案例:迈瑞血球分析仪
  7. make makefile cmake qmake都是什么,有什么区别
  8. 在这个“未来工厂”里, 人类仅凭脑电波控制机器
  9. 移动应用、大数据等推动广域网优化未来三年高速增长
  10. 关于获取电信光猫超级密码