基于 Tampermonkey 插件平台开发的淘宝直通车爬虫
crawler-userscript
一个基于 Tampermonkey 插件平台开发的爬虫。主要目的是最大限度模拟用户环境,避免被反爬虫系统识破。
本项目除了实现了一个爬虫框架以外,还是一个完整的淘宝直通车爬虫,可以实现下列功能:
- 可以抓取自己的淘宝直通车的推广计划、推广单元、关键字的详细数据;
- 每 1 小时抓取一次(可自定义触发时间);
- 每天 23:58 自动将抓取文件保存为 xls 文件并下载(可自定义下载时间);
- 当 token 过期时自动登陆(需设置账号和密码);
- 仅下载当前页面数据;
为什么在 Tampermonkey 上写爬虫?
- 接口足够开发爬虫。Tampermonkey 是一个跨浏览器的扩展平台,通常写一个爬虫所需要调用的底层接口,浏览器扩展程序都提供了。
- 不会被反爬虫系统封印。用浏览器扩展,可以最大程度的模拟用户真是行为,避免被烦爬虫系统发现。比如,如果用 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.js
,crawlerSchedulerSaver.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.数据采集[原始数据] 2.数据汇聚[经过清洗合并的可用数据] 3.数据转换和映射[经过分类,提取的专项主题数据] 4.数据应用 [提供api 智能系统 ...
- 基于低代码平台开发的督办系统为企业管理赋能
督办工作是推动企业领导决策实施,也行促进企业政令畅通的重要手段.相比于政企,企业对督办系统的往往关注度不高,认为企业不需要引进督办系统.其实督办系统是提高行政效率,实现工作创新的有效途径之一.现阶段有 ...
- 基于低代码平台开发的CRM客户管理系统,它能满足企业的需求吗?
CRM即客户关系管理系统,主要用于客户的管理与运营,是业务人员日常工作中不可缺少的工具之一,业务人员通过使用CRM系统可对客户信息进行统一的收集.管理.分析和运用,为后续企业运营优化奠定基础. 搭建系 ...
- 【基于Arduino IDE平台开发ESP8266连接巴法云】
Arduino教程传送门
- 基于Arduino IDE平台开发ESP8266天猫精灵控制LED灯
Arduino教程传送门
- AgileEAS.NET平台开发实例-药店系统-报表开发(上)
开篇 前面我们讲述了药店系统的开发流程,并且也讲述了如何开发一个基础模块,下面我们来看看,如何开发一个报表, 因为我们在药店系统中最常用的功能之一就是打印功 能了,AgileEAS.NET平台本身已提 ...
- 旋转机械 | 基于ANSYS WB平台的滑动轴承分析工具(一)
导读:本文主要针对Tribo-X inside ANSYS的功能及各方向应用实例进行介绍,限于篇幅关系会分五篇进行介绍,第一篇主要结合软件的需求.理论.功能及应用方向进行介绍,第二篇至第五篇将结合具体 ...
- android餐厅菜单功能,基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)...
基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)(毕业论文18000字,程序代码,SQLite数据库) 本课题是基于android(安卓)平台开发的,作为餐饮业点餐使用的一个工具 ...
- 基于Adaptive AUTOSAR平台的OTA解决方案
随着软件定义汽车时代的来临,AUTOSAR技术正不断发展进步以适用汽车智能化,网联化等普遍需求,特别是Adaptive AUTOSAR技术的产生更是让这些需求落地成为了可能,再加上汽车OTA升级需求对 ...
最新文章
- gin获取Get + Post 混合
- Silverlight 鼠标与键盘事件注意点
- jms中activemq事务探讨
- Altium designer原理图库中元件变动后在原理图中同步更新方法
- 全志A33-gpio驱动程序
- Javascript 调试技巧
- linux服务器做301跳转,nginx 实现当找不到文件时实现301跳转
- Python编写只允许实例化一个对象的类
- Json转化的三种方式
- 罗马尼亚:曾经的黑客避风港变身全球安全人才的摇篮
- 用matlab做bp神经网络预测,matlab神经网络怎么预测
- linux查看cuda驱动程序,我的nvidia驱动程序的正确CUDA版本是什么?
- 教你怎么用三种办法找到发给你QQ的坦白说的那个人
- Android简历模板
- Tone mapping进化论
- 低成本、快速造测试数据,这个工具你指的拥有
- 学习笔记28(凹凸贴图,法线贴图,位移贴图)
- Mysql批量删除大量数据
- ai中如何插入签名_怎么将CAD中插入图片的多余部分抠掉?如何设置透明效果?...
- 【Windows】常用盗版软件的替代免费软件列表