注解

不用弹出窗口方式,采用了2个iframe,分别是Left,Right。Right中有按钮。Left是数据采集用。

如图:

用到的知识点

插入iframe

动态生成iframe内容

动态生成iframe样式CSS

获取iframe中按钮元素按下事件

获取iframe onload事件

JS 写入本地文件

结论

用iframe方式,采集相同数据的速度比新窗口方式慢几倍。不知道这是不是iframe的缺点之一。

代码

// ==UserScript==
// @name            iFrame
// @author          初一他大爷
// @description     iFrame test
// @include         http*://flights.ctrip.com/schedule/*-*map.html
// @require         http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js
// @version         0.0.1
// @grant           none
// ==/UserScript==var finalData;var frameLeft=0;
var frameRight=0;var idLeft = "frameL";
var idRight = "frameR";
var idBtn = "myBtn";//change iframe height
function resizeFrame(){var itemWidth = ~~(document.documentElement.clientWidth*(9/10));frameLeft.width = itemWidth;frameRight.width =document.documentElement.clientWidth - itemWidth - 8;
}//get iframe parent URL
function getParentUrl() { var url = null; try {  url = parent.location.href; } catch (e) {url = document.referrer; }  return url;
} //Resize
window.onresize = function(){resizeFrame();
}//main
window.onload=function(){//Insert iframevar firstChild = document.body.firstChild;var frameL = document.createElement('iframe');frameL.setAttribute('id',idLeft);frameL.setAttribute('class',"myFrame");                               frameL.setAttribute('sytle','float:left');var frameR = document.createElement('iframe');frameR.setAttribute('id',idRight);frameR.setAttribute('class',"myFrame");                             frameR.setAttribute('sytle','float:right');    //find 1st childif (!firstChild){return;}//Insert before the first child//Append CSSvar mycss = document.createElement('style');var styleFrame = '.myFrame{';styleFrame += 'background-color:#E0FFFF;';styleFrame += 'scrolling:no;';styleFrame += 'frameborder:0;';styleFrame += 'height:50px;';styleFrame += '}';mycss.type = 'text/css';if (mycss.styleSheet){// This is required for IE8 and below.mycss.styleSheet.cssText = css;} else {mycss.appendChild(document.createTextNode(styleFrame));}//appedn Divvar divTmp = document.createElement('div');divTmp.appendChild(mycss);document.body.insertBefore(divTmp,firstChild);//append iframesdivTmp.appendChild(frameL);divTmp.appendChild(frameR);frameLeft = document.getElementById(idLeft);  frameRight = document.getElementById(idRight);  //resize frameresizeFrame();//frameLeft onloadif (frameLeft.attachEvent){frameLeft.attachEvent("onload", function(){GrabRest();   });} else {frameLeft.onload = function(){GrabRest();};}//frameRight onloadif (frameRight.attachEvent){frameRight.attachEvent("onload", function(){          //Set frame rightsetFrame();});} else {frameRight.onload = function(){//Set frame rightsetFrame();};}
}//set frame right
function setFrame(){//CSSvar styleBtn = '<style>';styleBtn += '.myButton {';styleBtn += 'background-color:#4CAF50;';styleBtn += 'border: none;';styleBtn += 'color: white;';styleBtn += 'padding: 10px 10px;';styleBtn += 'text-align: center;';styleBtn += 'text-decoration: none;';styleBtn += 'display: block;';styleBtn += 'font-size: 12px;';styleBtn += 'margin: 0 auto;';styleBtn += 'cursor: pointer;';styleBtn += '}';styleBtn += '</style>';frameRight.contentWindow.document.write(styleBtn);//add contentvar strDoc = '<button id="' + idBtn + '" class="myButton">开始</button>';frameRight.contentWindow.document.write(strDoc);//frameRight clickitemBtn = frameRight.contentWindow.document.getElementById(idBtn);if (itemBtn){if(itemBtn.attachEvent){itemBtn.attachEvent("onclick", function(){          GrabData();});} else {itemBtn.onclick = function(){GrabData();};}}
}//Grab data
function GrabData(){//Collect 1st page datafinalData = GetData(this.document);//Collect data of rest page(s)nextPage =  document.getElementsByClassName("schedule_down")[0];if(nextPage){//original nextPage.href is http, main page is https.newURL = nextPage.href.replace(/http/, "https");frameLeft.contentWindow.location.href = newURL;}
}//Grab rest pages
var pgCounter=2;
function GrabRest(){//Collect restfinalData = finalData + GetData(frameLeft.contentWindow.document);//NextnextPage =  frameLeft.contentWindow.document.getElementsByClassName("schedule_down")[0];if (nextPage){newURL = nextPage.href.replace(/http/, "https");document.title = ++pgCounter;frameLeft.contentWindow.location.href = newURL;}else{//Finishif(frameLeft.contentWindow.location.href !="about:blank"){writeData(finalData);}}
}//Get data from page
function GetData(docData){//Get tablevar tblRows = $(".fltlist_table > tbody > tr",docData);var lngRowLength;if (!tblRows && typeof(tblRows)!="undefined" && tblRows!=0){ alert("Cannot find table: fltlist_table");return;}  lngRowLength = tblRows.length;//console.log(lngRowLength);//Traversevar aryData = [lngRowLength];var strTmp = "";var strData = "";for(var i=0; i<lngRowLength; i++){aryData[i] = new Array(7)aryData[i][0] = tblRows[i].cells[0].innerText;strTmp = tblRows[i].cells[1].innerText;aryData[i][1] = strTmp.slice(0,strTmp.indexOf("\n"));aryData[i][2] = strTmp.slice(strTmp.indexOf("\n")+1);strTmp = tblRows[i].cells[2].innerText;aryData[i][3] = strTmp.slice(0,strTmp.indexOf("\n"));aryData[i][4] = strTmp.slice(strTmp.indexOf("\n")+1);strTmp = tblRows[i].cells[6].innerText;aryData[i][5] = strTmp.slice(0,strTmp.indexOf("\n"));aryData[i][6] = strTmp.slice(strTmp.indexOf("\n")+1);//mergefor(var j=0; j<7; j++){strData = strData + aryData[i][j] + ",";}strData = strData + "\r"       } return strData;
}function CurentTime(){ var now = new Date();var year = now.getFullYear();var month = now.getMonth() + 1;var day = now.getDate();var hh = now.getHours();var mm = now.getMinutes();var ss = now.getSeconds();var clock = year + "-";if(month < 10)clock += "0";clock += month + "-";if(day < 10)clock += "0";clock += day + " ";if(hh < 10)clock += "0";clock += hh + ":";if (mm < 10) clock += '0'; clock += mm + ":"; if (ss < 10) clock += '0'; clock += ss; return(clock);
}//Write data
function writeData(toSave){//Create <a>var eleLink = document.createElement('a');eleLink.download = "flight.csv";eleLink.style.display = 'none';var strData =  "\ufeff" + "航线名,起飞,到达,起飞机场,到达机场,航空公司,航班号,\r" + toSave;var objFile = new Blob([strData],{type: 'text/csv,charset=UTF-8'});eleLink.href = (window.URL || window.webkitURL).createObjectURL(objFile);//Append <a>document.body.appendChild(eleLink);//Click <a>eleLink.click();//Remove <a>document.body.removeChild(eleLink);
}

第二个暴力猴脚本- 改写后用iframe抓取携程某个城市所有起飞、到达航班并保存相关推荐

  1. python爬取携程机票并发送过滤后的机票信息到指定邮箱

    0x0 前言 在疫情发生之前,在知乎上刷到一个回答,说是用服务器实现一个自动爬取机票并将过滤后的机票信息发送到自己的邮箱中,感觉十分有趣.由于疫情原因无法返校,加上家和学校相隔接近3000公里,再加上 ...

  2. 二阶差分预测后数据还原公式_携程如何基于ARIMA时序分析做业务量的预测

    一. 前言 时间序列分析是统计学科的一个重要分支.它主要是通过研究随着时间的推移事物发展变化过程中的规律,来进行事物未来发展情况的预测.在我们的日常生活中,股票的价格走势,奶茶店每天的销售额,一年的降 ...

  3. 【Steam VR 2.X】unity Skeleton Poser 骨骼姿势 编辑好手势后 运行时 抓取姿势会偏

    问题描述: HTC vive,用skeleton poser为某个模型编辑好抓取姿势后,在Editor下看完全没问题,但一运行,抓取时,手的模型就会偏移到一个奇怪的位置,但姿势还是对的,就是偏移了. ...

  4. Selenium实战脚本集(3)--抓取infoq里的测试新闻

    描述 打开infoq页面,抓取最新的一些测试文章 需要抓取文章的标题和内容 如果你有个人blog的话,可以将这些文章转载到自己的blog 要求 不要在新窗口打开文章 自行了解最新的测试思潮与实践

  5. Charles安装后无法抓取https请求,显示 unknow

    问题描述 安装Charles后,双击打开,尝试抓取https请求,但抓取到的请求显示unknow,如下图: 问题原因 出现此问题的原因为Charles配置问题 解决办法 一. 安装证书 步骤: 1.点 ...

  6. 【Python爬虫教学】百度篇·手把手教你抓取百度搜索关键词后的页面源代码

    [开门见山] 最近整理了下之前做过的项目,学的东西不少,乱七八糟.打算写点关于 Python 爬虫的东西,新人一枚,还望大佬们多多担待,别把我头给打歪了. 前面我先磨叽磨叽些基础的东西,对爬虫新人友好 ...

  7. 网页JS自动化脚本(一)安装油猴或暴力猴等脚本管理器并新建脚本

    在我们的工作生活当中使用网页的机会越来越高,很多时候要进行重复的操作,所以进行一些JS脚本就成了可选项 首先我们要在网页浏览器中安装上脚本管理器,这里示范的是安装暴力猴,是一个开源的免费的小软件,是在 ...

  8. 我的第一个油猴脚本--微博超话自动签到

    简介 用户脚本是一段代码,它们能够优化您的网页浏览体验.安装之后,有些脚本能为网站添加新的功能,有些能使网站的界面更加易用,有些则能隐藏网站上烦人的部分内容.其中常见的有 油猴插件.ChromeExt ...

  9. 为了不手动命名驼峰变量名,我开发了一套油猴脚本...

    前言 你知道程序员最经常做的事是什么吗?是取变量名! 我们常规取变量名的方式是这样的,打开谷歌搜索或者有道搜索,输入变量的中文名,然后复制翻译结果,转到编译器改为驼峰命名,大致流程如下: 我个人对这种 ...

  10. [原创方法!] 如何实现全自动登录各大网站? Cookie格式 、油猴脚本基础 解决Github邮箱验证,持久登录,免验证码

    之前电脑内存小, 谷歌浏览器又是内存怪物, 每次浏览器不用的时候总是习惯关掉. 这就导致了每次进入常用的网站就要重新登陆, 非常烦;  对! 就是即使浏览器保存了密码, 大部分网站仍然要输入一下验证码 ...

最新文章

  1. android 多版本打包,Android build.gradle版本名打包配置的方法
  2. Apache ServiceComb — Service Center
  3. Java测试各种数据库连接(用Connection类)
  4. Java文件非法字符
  5. python爬虫 小白轻松从0到1_小白学 Python 爬虫(1):开篇
  6. Android Activity/Fragment间的数据传递
  7. 装饰器设计模式的应用
  8. 关于WKWebView高度的问题的解决
  9. 1.移动端测试知识笔记(面试必备,测试点,adb命令)
  10. mysql blob图片类型存储bug解决:索引超出了数组界限错误_索引超出了数组界限(Microsoft.SqlServer.Smo)...
  11. 在Vid4上突破28dB大关!视频超分新的里程碑:IconVSR
  12. SQL rownum的用法
  13. 将原生安卓项目封装为cordova插件实例分析
  14. 关于二叉树,你该了解这些!
  15. 禁不住诱惑?不可描述的应用之下暗藏巨大风险
  16. Vue+Element ui中常用表单验证----手机号、座机、传真、邮箱、身份证号、数字和带小数点的数字
  17. 下列不是python的注释方式_以下不是python的注释方式是( )_学小易找答案
  18. MPQ 文件系统完成
  19. 【科研记录】如何判断(你自己的)研究工作的价值
  20. 硬盘又坏了?硬盘数据恢复的工具有这些

热门文章

  1. 7个开源好用的管理系统,建议收藏加转载
  2. 徐小湛概率论与数理统计课件_概率论与数理统计视频教程下载
  3. python数据存储到access_Python操作Access数据库基本步骤分析
  4. 关于金融行业网络安全解决方案,您了解多少?
  5. 扫描转换html,HTML5/CSS3 3D雷达扫描动画
  6. 用goquery从国家统计局拉取最新省市区3级行政区划代码,生成SQL文件导入数据库
  7. IT成长中的龟兔赛跑
  8. Android UI个性style开源组件
  9. Echarts地图合并提取
  10. (没有ignore选项时)安装MongoDB4.0以上版本出现 Verify that you have sufficient privileges to start system services