问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Form认证iframe加载三方页面

发布网友 发布时间:2022-05-15 02:46

我来回答

2个回答

懂视网 时间:2022-05-15 07:07

这次给大家带来puppeteer模拟登录抓取页面的实现代码,puppeteer模拟登录抓取页面实现的注意事项有哪些,下面就是实战案例,一起来看一下。

关于热图

在网站分析行业中,网站热图能够很好的反应用户在网站的操作行为,具体分析用户的喜好,对网站进行针对性的优化,一个热图的例子(来源于ptengine)

上图中能很清晰的看到用户关注点在那,我们不关注产品中热图的功能如何,本篇文章就热图的实现做一下简单的分析和总结。

热图主流的实现方式

一般实现热图显示需要经过如下阶段:1.获取网站页面
2.获取经过处理后的用户数据
3.绘制热图
本篇主要聚焦于阶段1来详细的介绍一下主流的在热图中获取网站页面的实现方式
4.使用iframe直接嵌入用户网站
5.抓取用户页面保存到本地,通过iframe嵌入本地资源(所谓本地资源这里认为是分析工具这一端)

两种方式各有各的优缺点

首先第一种直接嵌入用户网站,这个有一定的限制条件,比如如果用户网站为了防止iframe劫持,不允许iframe嵌套(设置meta X-FRAME-OPTIONS 为sameorgin 或者直接设置http header ,甚至直接通过js来控制if(window.top !== window.self){ window.top.location = window.location;} ),这种情况下就需要客户网站做一部分工作才可以被分析工具的iframe加载,使用起来不一定那么方便,因为并不是所有的需要检测分析的网站用户都可以管理网站的。

第二种方式,直接抓取网站页面到本地服务器,然后浏览的是本机服务器上抓取的页面,这种情况下页面已经过来了,我们就可以为所欲为了,首先我们绕过了X-FRAME-OPTIONS 为sameorgin的问题,只需要解决js控制的问题,对于抓取的页面来说,我们可以通过特殊的对应来处理(比如移除对应的js控制,或者添加我们自己的js);但是这种方式也有很多的不足:1、无法抓取spa页面,无法抓取需要用户登录授权的页面,无法抓取用户设置了白明白的页面等等。

两种方式都存在https 和 http资源由于同源策略引起的另一个问题,https站无法加载http资源,所以如果为了最好的兼容性,热图分析工具需要被应用http协议,当然具体可以根据访问的客户网站而具体分站优化。

抓取网站页面如何优化

这里我们针对抓取网站页面遇到的问题基于puppeteer做一些优化,提高抓取成功的概率,主要优化以下两种页面:

1.spa页面

spa页面在当前页算是主流了,但是它总所周知的是其对搜索引擎的不友好;通常的页面抓取程序其实就是一个简单的爬虫,其过程通常都是发起一个http get 请求到用户网站(应该是用户网站服务器)。这种抓取方式本身就会有问题问题,首先,直接请求的是用户服务器,用户服务器对非浏览器的agent 应该会有很多限制,需要绕过处理;其次,请求返回的是原始内容,需要在浏览器中通过js渲染的部分无法获取(当然,在iframe嵌入后,js执行还是会再一定程度上弥补这个问题),最后如果页面是spa页面,那么此时获取的只是模板,在热图中显示效果非常不友好。

针对这种情况,如果基于puppeteer来做,流程就变成了

puppeteer启动浏览器打开用户网站-->页面渲染-->返回渲染后结果,简单的用伪代码实现如下:

const puppeteer = require('puppeteer');
async getHtml = (url) =>{
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 await page.goto(url);
 return await page.content();
}

这样我们拿到的内容就是渲染后的内容,无论页面的渲染方式如何(客户端渲染抑或服务端)

需要登录的页面

对于需要登录页面其实分为多种情况:

需要登录才可以查看页面,如果没有登录,则跳转到login页面(各种管理系统)

对于这种类型的页面我们需要做的就是模拟登录,所谓模拟登录就是让浏览器去登录,这里需要用户提供对应网站的用户名和密码,然后我们走如下的流程:

访问用户网站-->用户网站检测到未登录跳转到login-->puppeteer控制浏览器自动登录后跳转到真正需要抓取的页面,可用如下伪代码来说明:

const puppeteer = require("puppeteer");
async autoLogin =(url)=>{
 const browser = await puppeteer.launch();
 const page =await browser.newPage();
 await page.goto(url);
 await page.waitForNavigation();
 //登录
 await page.type('#username',"用户提供的用户名");
 await page.type('#password','用户提供的密码');
 await page.click('#btn_login');
 //页面登录成功后,需要保证redirect 跳转到请求的页面
 await page.waitForNavigation();
 return await page.content();
}

登录与否都可以查看页面,只是登录后看到内容会所有不同 (各种电商或者portal页面)

这种情况处理会比较简单一些,可以简单的认为是如下步骤:

通过puppeteer启动浏览器打开请求页面-->点击登录按钮-->输入用户名和密码登录 -->重新加载页面

基本代码如下图:

const puppeteer = require("puppeteer");
async autoLoginV2 =(url)=>{
 const browser = await puppeteer.launch();
 const page =await browser.newPage();
 await page.goto(url);
 await page.click('#btn_show_login');
 //登录
 await page.type('#username',"用户提供的用户名");
 await page.type('#password','用户提供的密码');
 await page.click('#btn_login');
 //页面登录成功后,是否需要reload 根据实际情况来确定
 await page.reload();
 return await page.content();
}

总结

明天总结吧,今天下班了。

补充(还昨天的债):基于puppeteer虽然可以很友好的抓取页面内容,但是也存在这很多的局限

1.抓取的内容为渲染后的原始html,即资源路径(css、image、javascript)等都是相对路径,保存到本地后无法正常显示,需要特殊处理(js不需要特殊处理,甚至可以移除,因为渲染的结构已经完成)

2.通过puppeteer抓取页面性能会比直接http get 性能会差一些,因为多了渲染的过程

3.同样无法保证页面的完整性,只是很大的提高了完整的概率,虽然通过page对象提供的各种wait 方法能够解决这个问题,但是网站不同,处理方式就会不同,无法复用。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

Vue如何操作html字段字符串转换为HTML标签

Koa2实现文件上传下载案例分析

热心网友 时间:2022-05-15 04:15

没法直接加载。
看了一下puppeteer的资料,虽然可以抓取网页成截图或者html文件,但是如果第三方网页中含有自己的js样式链接,图片之类,只抓取html部分的话,相关的一些标签显示内容会有问题,类似百度翻译中,如果输入网址www.163.com,翻译后网页闪一下就没了这个现象。需要手动识别DOM内标签仿照浏览器保存网页一样抓取吗之前我试验了一下,浏览器内保存后的网页,直接用iframe显示的时候好像也是有一些问题。
直接用js实现不了的吧,这跨域问题没法解决啊,不过感觉可以使用puppeteer来实现。前端调用接口(传三方页面参数)->puppeteer获取该页面内容,并修改内容->返回修改后的内容,前端进行渲染。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑文件编辑好如何发送给微信如何把电脑上的文件发到微信上 笔记本电脑上的文件发送到微信怎么把电脑里的文件传到手机微信 我每天早晨吃米糊放白糖有害吗? 吃糖太多对我有好处么! 适合明年工作计划开头的句子 让人耳目一新的年度工作计划开头句子锦集五十四句 个人年度工作计划开头优美句子 让上司眼前一亮的工作计划开头语收藏四十一句 工作计划开头 怎么写工作计划开头 新干线0系电动列车的运行设备 LOL求几款性价比较高的皮肤 冻疮怎么预防 从家用车到顶级钢炮悉数在列 奔驰成都车展阵容曝光 领克05/奔驰CLA终于来了,2020年第一季度上市新车汇总 奔驰年内推至少18款新车 中改E级/新GLA最抢眼! 全新AMG CLA 35猎装版专利图 搭2.0T发动机 加速仅4.9s CLA 35/45原厂升级,梅赛德斯-AMG推全新空气动力学套装 奔驰即将推出18款新车!新E级、GLE轿跑领衔,你看好谁? 搭载1.3T 全新一代奔驰CLA动力信息曝光 或6月上市 奔驰cla35猎装版大约多少钱? 全新奔驰CLA前景展望:或售23.98万元起 期待猎装版 奔驰全新CLA实拍!最快1季度引入,搭2.0T引擎 成都车展奔驰CLA家族实拍,猎跑版不负期待 包含CLA猎装版 全新奔驰GLA/CLA将于7月23日上市 麻衣相师让他小心身边的人是谁? 全新CLA35 AMG Shooting Brake 海外发布 麻衣相师有声小说_星魂 麻衣相师景朝国君是谁 什么是猎装车?除了CC猎装之外,奔驰CLA猎装版也将国产! 求 麻衣相师李北斗 百度云资源,谢谢 英雄联盟哪些皮肤有特效的皮肤 手冻成这样了怎么才能好 英雄联盟魔腾皮肤哪些有特效?有特效的名字,价钱标出来 第一人征服北极点的人是哪个国家 魅蓝note3可以刷成oppor9的系统吗 oppo r9s和魅族pro6哪个好 在EXCEL的单元格中怎么设置输入的数值只能在目标值内 在excel工作表中,若想设置单元格中数据的输入类型及数据的有效范围,,可以使用? excel如何实现通过方向键控制活动单元格只能在一定范围内移动,即移动到最后一列就自动跳转到下一行 vba 如何*单元格特定区域为有效区域,其他地方不允许输入数值比如A1:DI518,不要锁定的, 如何在电子表格中限定单元格的范围 excel如何使单元格中的文字始终显示在可见区域内 割双眼皮熬夜? 割的双眼皮熬夜有影响吗 刚做完埋线双眼皮,熬夜有影响吗? 做了双眼皮后,可以熬夜不? 割双眼皮没恢复好可以熬夜吗 割完双眼皮一个月后熬夜好吗 割双眼皮能不能熬夜?今天割了的第一天 割完双眼皮后为什么不能熬夜