node基于puppeteer模拟登录抓取步骤详解

这次给大家带来node基于puppeteer模拟登录抓取步骤详解,node基于puppeteer模拟登录抓取的注意事项有哪些,下面就是实战案例,一起来看一下。

关于热图

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

node基于puppeteer模拟登录抓取步骤详解

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

热图主流的实现方式

一般实现热图显示需要经过如下阶段: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 方法能够解决这个问题,但是网站不同,处理方式就会不同,无法复用。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Puppeteer入门案例详解

js合并数组合生成key:value步骤详解

以上就是node基于puppeteer模拟登录抓取步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2759666.html

(0)
上一篇 2025年3月8日 08:34:13
下一篇 2025年3月5日 22:16:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 用node puppeteer实现网站登录代码解析

    这次给大家带来用node puppeteer实现网站登录代码解析,用node puppeteer实现网站登录的注意事项有哪些,下面就是实战案例,一起来看一下。 puppeteer简介 puppeteer是Chrome团队开发的一个node库…

    2025年3月8日
    200
  • 怎样实现Vue微信项目按需授权登录

    这次给大家带来怎样实现Vue微信项目按需授权登录,实现Vue微信项目按需授权登录的注意事项有哪些,下面就是实战案例,一起来看一下。 项目采用Vue作为开发框架,用户浏览页面时有两种情况: 一种是需要用户先登录之后才能继续浏览; 另一种是用户…

    编程技术 2025年3月8日
    200
  • 如何让node中promise替代回调函数

    这次给大家带来如何让node中promise替代回调函数,如何让node中promise替代回调函数的注意事项有哪些,下面就是实战案例,一起来看一下。 在学习 Node.js 过程中接触到了如何使用 async 来控制并发(使用 async…

    编程技术 2025年3月8日
    200
  • 怎么使用node中async控制并发

    这次给大家带来怎么使用node中async控制并发,使用node中async控制并发的注意事项有哪些,下面就是实战案例,一起来看一下。 目标 建立一个 lesson5 项目,在其中编写代码。 代码的入口是 app.js,当调用 node a…

    2025年3月8日
    200
  • 用AJAX实现页面登陆以及注册用户名验证的简单实例

    下面我就为大家带来一篇用ajax实现页面登陆以及注册用户名验证的简单实例。现在就分享给大家,也给大家做个参考。 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交…

    编程技术 2025年3月8日
    200
  • 如何用node实现爬虫功能

    这次给大家带来如何用node实现爬虫功能,用node实现爬虫功能的注意事项有哪些,下面就是实战案例,一起来看一下。 node是服务器端的语言,所以可以像python一样对网站进行爬取,下面就使用node对博客园进行爬取,得到其中所有的章节信…

    2025年3月8日
    200
  • 怎样使linux后台运行node服务指令

    这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。 启动node 服务时候发现 node servier.js跑起来之后,一旦断开连接,服务也就停了, 使用 nohup node servier.js & 就可以让代…

    编程技术 2025年3月8日
    200
  • linux后台运行node服务指令步骤方法

    这次给大家带来linux后台运行node服务指令步骤方法,linux后台运行node服务指令的linux有哪些,下面就是实战案例,一起来看一下。 启动node 服务时候发现 node servier.js跑起来之后,一旦断开连接,服务也就停…

    编程技术 2025年3月8日
    200
  • 如何使用node结合swig渲染摸板

    这次给大家带来如何使用node结合swig渲染摸板,使用node结合swig渲染摸板的注意事项有哪些,下面就是实战案例,一起来看一下。 首先当然是利用express框架在node后台上面搭建服务 var express = require(…

    2025年3月8日
    200
  • 怎么使用node实现基于token身份验证

    这次给大家带来怎么使用node实现基于token身份验证,使用node实现基于token身份验证的注意事项有哪些,下面就是实战案例,一起来看一下。 最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论