Greasemonkey,简称GM,中文俗称为“油猴子”,是Mozilla Firefox的一个附加组件。它让用户安装一些脚本使大部分HTML为主的网页于用户端直接改变得更方便易用。
随着Greasemonkey脚本常驻于浏览器,每次随着目的网页打开而自动做修改,使得运行脚本的用户印象深刻地享受其固定便利性。
大部分Greasemonkey使用者脚本都是自行撰写,使用对某网站专用的JavaScript代码,透过文档对象模型(DOM)接口对网页内容做操作。维护了个 Greasemonkey 数据库。该数据库描述哪个网址网页对应到哪个脚本。(注意:废弃脚本仓库 可能还保留许多还没合并到新仓库)。
当使用者加载匹配的网页,Greasemonkey便呼叫相关的脚本,而该脚本便为该页加入输出结果、删除该页的部分、或者移动碍眼的部分。
Greasemonkey脚本亦能透过非网域绑定的XMLHTTP要求来查询外部HTTP资源。Greasemonkey亦遵循某使用者名.user.js 的格式,这让当该特定使用者拜访时 Greasemonkey 可自动侦测并提供安装选项。
除了JavaScript代码,Greasemonkey脚本包括有限可选用后资料集。该后资料集描述了脚本名称、脚本描述、网址用来区分同名脚本的位址空间、以及原本该脚本为哪些网址撰写的列表。
Greasmonkey脚本写作过程要求高技术 (虽然比起写个五脏俱全的Firefox扩展简单点)。这意味着非常少的一般使用者可以实际上撰写 Greasemonkey 扩展。
不过,Platypus 扩展可让使用者可以编辑网页 (删除或者移动某碍眼的部分)。Platypus随后将结果存成常驻的Greasemonkey脚本。
技术
Greasemonkey 用户脚本是用JavaScript编写的,并使用文档对象模型界面操作网页的内容。脚本通常被编写为特定于页面或特定于域(适用于域内的所有页面),但也可能被标记为适用于全局浏览器增强的所有域。
Greasemonkey 的用户可以编写或下载脚本并将它们保存到自己的个人库中。当用户访问与其个人脚本库中的脚本匹配的网站时,Greasemonkey 会调用相关脚本。
Greasemonkey 脚本可以以 JavaScript 允许的任何方式修改网页,但具有某些 Greasemonkey 安全限制。脚本还可以通过不受域限制的XMLHTTP请求访问其他网页和Web 服务,从而允许将外部内容与原始页面内容合并。
脚本被命名为somename .user.js,当请求以该后缀结尾的 URL 时,Greasemonkey 提供安装任何此类脚本。
Greasemonkey 脚本包含元数据,这些元数据指定脚本名称、描述、脚本所需资源、用于区分同名脚本的命名空间URL 以及打算调用或不调用脚本的 URL 模式。
编写 Greasemonkey 脚本类似于为网页编写 JavaScript,但有一些额外的限制,例如跨站点XMLHttpRequests。与编写成熟的 Firefox 扩展程序相比,用户脚本编写在复杂性上比基本 Web 编程略有增加。
但是,由于 Mozilla 的 XPCNativeWrappers 施加的安全限制,Greasemonkey 脚本受到限制,例如,Greasemonkey 脚本无法访问 Firefox 的许多组件,例如下载管理器、I/O 进程或其主要工具栏。
此外,Greasemonkey 脚本会针对匹配网页的每个实例运行。因此,全局管理项目列表很困难。然而,脚本编写者一直在使用 cookie,Greasemonkey 甚至提供了 GM_getValue 和 GM_setValue 等 API 来解决这个问题。
以上内容参考 百度百科-Greasemonkey
目前很多知名的网站都增加一些反爬虫手段,使得编写爬虫时并不那么理想,有些网站很难破解其反爬技术。如利用puppeteer技术操作页面时,往往出现一些加载异常,容易被网站检测程序探测到而拒绝响应。
浏览器扩展程序油猴(tampermonkey)似乎可以做很多事件,对分析网页与事件处理有大的能力空间。由于油猴是在用户手动打开的浏览器下运行的,完全是与真人操作类似,可能不那么容易被检测到。
思路是这样的:
第一步:人工启动浏览器,导航到要抓取数据的页面;(这一步是唯一人工干扰的)
第二步:油猴自动启动,分析页面,处理页面数据;
第三步:将获得的数据通过GM_xmlhttpRequest接口推送到后台数据接收服务,将数据入库;
第三步:获得“下一页”标签元素,触发下一页请求;返回第二步重复运行;
第四步:没有“下一页”时,程序退出。
上述方案的缺点很明显,那就是第一步必须是人工启动浏览,导航到具体页面,没有计划任务。
当然这不是大问题,还是利用油猴,编写一个计划任务的脚本来解决上述问题,即利用js定时器,触发指定的页面。更进一步,我们有好多爬虫脚本,这时我们就做一个任务队列,让js定时器通过导航到指定页面来启动对应的js脚本。js定时器的@match值为 http://*/* 。
具体做法是:
一、编辑js定时器(计划任务),实现定时打开指定网站;
二、让浏览器始终打开;
三、部分需要登录的网站,先行登录;并让定时器第间隔一段时间(如半小时)刷新一下网站的一个非数据页面。
四、爬虫脚本执行完后,尽量关闭页签,以节省电脑资源。