crawler-userscript

一个基于 Tampermonkey 插件平台开发的爬虫。主要目的是最大限度模拟用户环境,避免被反爬虫系统识破。

本项目除了实现了一个爬虫框架以外,还是一个完整的淘宝直通车爬虫,可以实现下列功能:

  • 可以抓取自己的淘宝直通车的推广计划、推广单元、关键字的详细数据;
  • 每 1 小时抓取一次(可自定义触发时间);
  • 每天 23:58 自动将抓取文件保存为 xls 文件并下载(可自定义下载时间);
  • 当 token 过期时自动登陆(需设置账号和密码);
  • 仅下载当前页面数据;

为什么在 Tampermonkey 上写爬虫?

  1. 接口足够开发爬虫。Tampermonkey 是一个跨浏览器的扩展平台,通常写一个爬虫所需要调用的底层接口,浏览器扩展程序都提供了。
  2. 不会被反爬虫系统封印。用浏览器扩展,可以最大程度的模拟用户真是行为,避免被烦爬虫系统发现。比如,如果用 selenium 来登陆淘宝,浏览器会留下一些记号,比如 window.navigator.webdriver = true,淘宝就能发现而阻止其登陆。后来,有各种大神想各种办法绕过淘宝网站的检测,但是过不了几个月,总是又被淘宝堵住漏洞。所以,selenium 不是长久之际,浏览器扩展才是一劳永逸的解决方法,因为淘宝不可能仅仅因为你装了扩展就阻止你登陆。

安装和运行

还没有时间把这个爬虫库做成一个第三方库,大家可以直接clone代码来运行。

下载代码:

git clone https://github.com/zjh1943/crawler-userscript.git

安装依赖库:

cd {project_root}
npm i

启动 http 服务:

npm run dev

这个命令会启动一个端口为 9001 的 HTTP 服务,根目录为{project_root}

构建代码:

npm run build

这里会将构建好的userscript文件保存到{project_root}/dist/ant.user.js。每次修改完代码后,需要重新运行此命令。

开发指引

  • 如果要在 Tampermonkey 中安装脚本,则可以直接将 {project_root}/dist/ant.user.js文件内容拷贝过去即可。
  • 如果在写代码时需要更新以调试,则在 Tampermonkey 中设置脚本更新地址为:https://localhost:9001/dist/ant.user.js 即可。这样,每次修改完代码后重新构建(npm run build),再点击 Tampermonkey 插件上的「检查更新」,就会自动更新最新的代码。
  • 引用的外部库,代码写在template.user.js文件的头部,比如要使用XLSX库,就在template.user.js中添加// @require https://unpkg.com/xlsx/dist/xlsx.full.min.js这一行。当执行npm run build时,这部分内容会自动写入 {project_root}/dist/ant.user.js 中去。

爬虫配置

爬虫配置项:

爬虫开发

最简单的爬虫

const Crawler = require('./crawler.js');
crawler = new Crawler({startPageURL: 'https://subway.simba.taobao.com/#!/manage/campaign/index', // 启动地址gotoUrl: async (url) => { location.href = url }, // 跳转链接的方法。Crawler 是一个纯 JS 库,你可以自由选择跳转方式。pageList: [ // pageList 是一个列表,列表中每一项代表一组有相同结构的网页。{id: 'keywordsList',triggerOnUrl: (url) => {// 当前配置项所适用的网页return !!url && !!url.match(/(https:\/\/subway.simba.taobao.com)?\/?(#\!\/manage\/adgroup\/detail)(.*)/;},onPageReady: async () => {// 网页已经加载完,在这里提取想要的数据,选择合适的方式保存数据。},getUrlsToAdd: () => {// 从当前网页中找出需要加入爬虫队列的新的链接。return urls;},// 判断网页是否已经抓取完。isPageReady: () => $('.table-td .bp-table tr').length > 0,},// 此处可以增加多个待爬取页面,每一个都跟上面的配置类似,不再赘述。...],
}crawler.start();

更多爬虫配置项

const Crawler = require('./crawler.js');
http://www.biyezuopin.vip
crawler = new Crawler({startPageURL: 'https://subway.simba.taobao.com/#!/manage/campaign/index', // 启动地址minWait: 3000,maxWait: 5000,gotoUrl: async (url) => { location.href = url },pageList: [ // pageList 是一个列表,列表中每一项代表一组有相同结构的网页。{id: 'keywordsList',triggerOnUrl: (url) => {// 当前配置项所适用的网页return !!url && !!url.match(/(https:\/\/subway.simba.taobao.com)?\/?(#\!\/manage\/adgroup\/detail)(.*)/;},onPageReady: async () => {// 网页已经加载完,在这里提取想要的数据。},getUrlsToAdd: () => {// 从当前网页中找出需要加入爬虫队列的新的链接。return urls;},// 判断网页是否已经抓取完。isPageReady: () => $('.table-td .bp-table tr').length > 0,},// 此处可以增加多个待爬取页面,每一个都跟上面的配置类似,不再赘述。...],login: {needLogin: true, // 是否需要登陆loginPageURL: '', // 登陆地址needLogin: () => {// 根据网页当前显示的内容,来判断 token 是否已经过期,是否需要登陆。return false;},isLoginSuccess: () => {// 根据网页内容,判断是否已经登陆成功。return false;},doLogin: async () => {// 执行登陆操作},isLoginPageReady: () => {// 登陆页面是否已经加载完全return false;}}};)
http://www.biyezuopin.vip
crawler.start().then(() => {// 爬取成功。}).catch( (msg) => {// 爬取失败});// 停止并清空爬虫队列。
crawler.clear();// 暂停和恢复。爬虫状态仍然保存。
crawler.pause();
crawler.resume();

关于自动登陆

问题1:页面刷新后 userscript 的内存清空

当「直通车」的 token 过期,需要重新登陆时,页面会自动条转到登陆页面,此时浏览器会触发「刷新」操动作。
此时,userscript 的上下文环境全部丢失,整个内存都会丢失。所以,我在每抓取一个页面后,都会用GM_setValue()保存爬虫的抓取进度,当页面重新加载成功后,再恢复。具体的代码在 crawlerSaver.jscrawlerSchedulerSaver.js 两个文件中。

问题2:userscript 中 iframe 元素操作

当页面有iframe元素时,且 inner window 跟 top window 不同源时,userscript 中无法直接对iframe进行操作。此时,userscript 会创建 N 份实例(N等于总共 window 数量),分别对应 top window 和若干个 inner window。http://www.biyezuopin.vip

淘宝的登陆框在 inner window 里,所以登陆操作只能在 inner window 对应的 userscript 实例里进行。具体代码请见:

window.onload = async () => {setupConfig();later.date.localTime();// 在 Tampermonkey 中,一个网页有多个 frame,每个 frame 都满足 userscript 的触发条件时,会启动多个实例。// 在 Tampermonkey 中,不同源的 iframe ,很难进行直接操作。所以,必须分开在两个环境中进行。// top windowif (window.top == window.self) {log.debug('top window');// 初始化// 启动下载数据的调度器startDownloadScheduler();// 恢复调度器schedulerSaver.restoreScrawlerScheduler(startCrawlerSchedulerByText);// 恢复之前未完成的爬取任务if (crawlerSaver.hasUnfinishedTask()) {log.debug(`restore Unfinished Crawler`);if (!loginOptions.needLogin()) {currRunningCrawler = createDefaultCrawler();crawlerSaver.restoreCrawler(currRunningCrawler);}}} else { // inner windowlog.debug('inner window');// 判断是否是登陆页面if (crawlerSaver.hasUnfinishedTask() && loginOptions.needLogin()) {log.debug(`login`);currRunningCrawler = createDefaultCrawler();await currRunningCrawler.login();}}
};

其他

此项目其实是一个完整的项目实例,包括如何配置爬虫、存储数据等。
更多精彩内容可以慢慢看代码。

基于 Tampermonkey 插件平台开发的淘宝直通车爬虫相关推荐

  1. 基于大数据平台开发工作总结

    大数据开发 大数据开发,有几个阶段: 1.数据采集[原始数据]    2.数据汇聚[经过清洗合并的可用数据] 3.数据转换和映射[经过分类,提取的专项主题数据] 4.数据应用 [提供api 智能系统 ...

  2. 基于低代码平台开发的督办系统为企业管理赋能

    督办工作是推动企业领导决策实施,也行促进企业政令畅通的重要手段.相比于政企,企业对督办系统的往往关注度不高,认为企业不需要引进督办系统.其实督办系统是提高行政效率,实现工作创新的有效途径之一.现阶段有 ...

  3. 基于低代码平台开发的CRM客户管理系统,它能满足企业的需求吗?

    CRM即客户关系管理系统,主要用于客户的管理与运营,是业务人员日常工作中不可缺少的工具之一,业务人员通过使用CRM系统可对客户信息进行统一的收集.管理.分析和运用,为后续企业运营优化奠定基础. 搭建系 ...

  4. 【基于Arduino IDE平台开发ESP8266连接巴法云】

    Arduino教程传送门

  5. 基于Arduino IDE平台开发ESP8266天猫精灵控制LED灯

    Arduino教程传送门

  6. AgileEAS.NET平台开发实例-药店系统-报表开发(上)

    开篇 前面我们讲述了药店系统的开发流程,并且也讲述了如何开发一个基础模块,下面我们来看看,如何开发一个报表, 因为我们在药店系统中最常用的功能之一就是打印功 能了,AgileEAS.NET平台本身已提 ...

  7. 旋转机械 | 基于ANSYS WB平台的滑动轴承分析工具(一)

    导读:本文主要针对Tribo-X inside ANSYS的功能及各方向应用实例进行介绍,限于篇幅关系会分五篇进行介绍,第一篇主要结合软件的需求.理论.功能及应用方向进行介绍,第二篇至第五篇将结合具体 ...

  8. android餐厅菜单功能,基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)...

    基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)(毕业论文18000字,程序代码,SQLite数据库) 本课题是基于android(安卓)平台开发的,作为餐饮业点餐使用的一个工具 ...

  9. 基于Adaptive AUTOSAR平台的OTA解决方案

    随着软件定义汽车时代的来临,AUTOSAR技术正不断发展进步以适用汽车智能化,网联化等普遍需求,特别是Adaptive AUTOSAR技术的产生更是让这些需求落地成为了可能,再加上汽车OTA升级需求对 ...

最新文章

  1. gin获取Get + Post 混合
  2. Silverlight 鼠标与键盘事件注意点
  3. jms中activemq事务探讨
  4. Altium designer原理图库中元件变动后在原理图中同步更新方法
  5. 全志A33-gpio驱动程序
  6. Javascript 调试技巧
  7. linux服务器做301跳转,nginx 实现当找不到文件时实现301跳转
  8. Python编写只允许实例化一个对象的类
  9. Json转化的三种方式
  10. 罗马尼亚:曾经的黑客避风港变身全球安全人才的摇篮
  11. 用matlab做bp神经网络预测,matlab神经网络怎么预测
  12. linux查看cuda驱动程序,我的nvidia驱动程序的正确CUDA版本是什么?
  13. 教你怎么用三种办法找到发给你QQ的坦白说的那个人
  14. Android简历模板
  15. Tone mapping进化论
  16. 低成本、快速造测试数据,这个工具你指的拥有
  17. 学习笔记28(凹凸贴图,法线贴图,位移贴图)
  18. Mysql批量删除大量数据
  19. ai中如何插入签名_怎么将CAD中插入图片的多余部分抠掉?如何设置透明效果?...
  20. 【Windows】常用盗版软件的替代免费软件列表

热门文章

  1. 钉钉入局在线文档市场,阿里和腾讯再次对决?
  2. VUE从一个页面传值到另一个页面
  3. 微信小程序之页面样式以及背景图片显示问题
  4. 【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
  5. mba和研究生的区别
  6. 手把手教你Linux内核编译(三天吐血经历)
  7. 抖音爆火微信每日早安推送
  8. TGRS2022/遥感:An Empirical Study of Remote Sensing Pretraining遥感预训练的实证研究
  9. NER依存关系模型:原理,建模及代码实现
  10. ubuntu 印象笔记