当前位置: 首页 > news >正文

探索Puppeteer的强大功能:抓取隐藏内容

亿牛云爬虫代理.png

背景/引言

在现代网页设计中,动态内容和隐藏元素的使用越来越普遍,这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容,传统的静态爬虫技术往往力不从心。Puppeteer,作为一个强大的无头浏览器工具,提供了丰富的功能来模拟用户行为,从而轻松抓取这些动态内容。本文将介绍如何使用Puppeteer抓取网页中的隐藏内容,并结合爬虫代理IP、useragent、cookie等设置,确保爬取过程的稳定性和高效性。

正文

Puppeteer介绍

Puppeteer是一个由Google维护的Node库,它提供了一个高层次的API来控制Chrome或Chromium浏览器。通过Puppeteer,我们可以自动执行诸如表单提交、UI测试、键盘输入等操作。它特别适用于处理JavaScript渲染的动态网页和隐藏元素。

抓取隐藏内容的几种方式

在实际应用中,隐藏内容可能是通过点击按钮、滚动页面等操作后才会显示。Puppeteer允许我们模拟这些用户操作,从而获取隐藏的内容。下面将介绍几种常见的抓取隐藏内容的方法。

1. 模拟点击操作

有些隐藏内容需要通过点击按钮或链接来显示。例如,一个“显示更多”按钮可能会加载更多的内容。

await page.click('#showHiddenContentButton');
await page.waitForSelector('#hiddenContent', { visible: true });
const hiddenContent = await page.evaluate(() => document.querySelector('#hiddenContent').innerText);
console.log('隐藏内容:', hiddenContent);
2. 滚动页面加载内容

某些页面通过滚动加载更多内容,比如无限滚动的社交媒体页面。在这种情况下,我们可以模拟滚动操作。

await page.evaluate(async () => {for (let i = 0; i < 10; i++) {window.scrollBy(0, window.innerHeight);await new Promise(resolve => setTimeout(resolve, 1000));}
});
const content = await page.content();
console.log('滚动加载的内容:', content);
3. 表单提交

有些隐藏内容需要通过表单提交来触发。例如,输入搜索关键词并点击搜索按钮。

await page.type('#searchInput', 'Puppeteer');
await page.click('#searchButton');
await page.waitForSelector('#searchResults', { visible: true });
const searchResults = await page.evaluate(() => document.querySelector('#searchResults').innerText);
console.log('搜索结果:', searchResults);
4. 等待特定时间

有些内容可能需要等待一段时间后才会加载,这时可以使用延时等待的方法。

await page.waitForTimeout(5000); // 等待5秒钟
const delayedContent = await page.evaluate(() => document.querySelector('#delayedContent').innerText);
console.log('延时加载的内容:', delayedContent);

使用爬虫代理IP、User-Agent和Cookie设置

在爬取过程中,使用爬虫代理IP、User-Agent和Cookie可以有效避免被网站封禁,提高爬取的稳定性和效率。

实例代码

以下是一个综合实例代码,展示如何使用Puppeteer抓取隐藏内容,并结合亿牛云爬虫代理、User-Agent和Cookie设置。

const puppeteer = require('puppeteer');(async () => {// 使用爬虫代理IP的配置 亿牛云爬虫代理标准版const proxy = {host: 'www.16yun.cn', // 代理服务器地址port: 12345, // 代理服务器端口username: 'your_username', // 代理服务器用户名password: 'your_password' // 代理服务器密码};// 启动浏览器,并配置代理和useragentconst browser = await puppeteer.launch({args: [`--proxy-server=${proxy.host}:${proxy.port}`]});const page = await browser.newPage();// 设置User-Agentawait page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');// 设置Cookieawait page.setCookie({name: 'example_cookie',value: 'example_value',domain: 'example.com'});// 代理服务器身份验证await page.authenticate({username: proxy.username,password: proxy.password});// 打开目标网页await page.goto('https://example.com');// 模拟点击操作以显示隐藏元素await page.click('#showHiddenContentButton');// 等待隐藏元素加载并显示await page.waitForSelector('#hiddenContent', { visible: true });// 获取隐藏元素的内容const hiddenContent = await page.evaluate(() => document.querySelector('#hiddenContent').innerText);console.log('隐藏内容:', hiddenContent);// 模拟滚动操作以加载更多内容await page.evaluate(async () => {for (let i = 0; i < 10; i++) {window.scrollBy(0, window.innerHeight);await new Promise(resolve => setTimeout(resolve, 1000));}});// 获取滚动加载的内容const content = await page.content();console.log('滚动加载的内容:', content);// 模拟表单提交以获取隐藏内容await page.type('#searchInput', 'Puppeteer');await page.click('#searchButton');await page.waitForSelector('#searchResults', { visible: true });const searchResults = await page.evaluate(() => document.querySelector('#searchResults').innerText);console.log('搜索结果:', searchResults);// 等待特定时间后获取内容await page.waitForTimeout(5000); // 等待5秒钟const delayedContent = await page.evaluate(() => document.querySelector('#delayedContent').innerText);console.log('延时加载的内容:', delayedContent);await browser.close();
})();

代码解析

  1. 爬虫代理IP配置:通过puppeteer.launch方法中的args参数配置代理服务器地址和端口。使用page.authenticate方法进行代理服务器的身份验证。
  2. User-Agent设置:通过page.setUserAgent方法设置自定义的User-Agent字符串,模拟真实浏览器访问。
  3. Cookie设置:通过page.setCookie方法设置自定义的Cookie,模拟已登录状态或其他特定用户状态。
  4. 模拟用户操作:通过page.click方法模拟用户点击操作,显示隐藏内容。通过page.waitForSelector方法等待隐藏元素加载并显示。
  5. 滚动操作:通过page.evaluate方法模拟滚动操作,加载更多内容。
  6. 表单提交:通过page.typepage.click方法模拟表单输入和提交,获取隐藏内容。
  7. 延时等待:通过page.waitForTimeout方法等待特定时间后获取延时加载的内容。

结论

Puppeteer作为一个功能强大的无头浏览器工具,为我们提供了模拟用户行为、抓取动态内容的能力。结合代理IP、User-Agent和Cookie设置,可以有效提升爬取的稳定性和效率。通过上述示例代码,我们可以轻松抓取网页中的隐藏内容,为数据采集和分析提供有力支持。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OWASP 移动应用 2024 十大安全风险
  • 为ppt中的文字配色
  • 在 Ubuntu上安装 Docker
  • 详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链
  • vue是如何进行监听数据变化的?vue2和vue3分别是什么?vue3为什么要更换?
  • Rust Result 与可恢复的错误
  • 【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址
  • 子进程继承父进程文件描述符导致父进程打开设备文件失败
  • C#字符串基本操作
  • 【ARM】SMMU系统虚拟化整理
  • Docker容器化技术(1)
  • python中的re模块--正则表达式
  • 美图WHEE AI:包括文生图、图生图、风格模型训练多种模式图片创作绘画创作平台
  • 查看仓库文件的改变(git-status , git-diff)
  • 前后端数据交互设计到的跨域问题
  • 2017 年终总结 —— 在路上
  • 2017-09-12 前端日报
  • 230. Kth Smallest Element in a BST
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ECS应用管理最佳实践
  • uva 10370 Above Average
  • 前端
  • 前端路由实现-history
  • 区块链将重新定义世界
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用简单代码看卷积组块发展
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • raise 与 raise ... from 的区别
  • Spring第一个helloWorld
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #stm32整理(一)flash读写
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (3) cmake编译多个cpp文件
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)进入MySQL 【事务】
  • (学习日记)2024.01.19
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Sublime Text3配置Lua运行环境
  • .cn根服务器被攻击之后
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET学习全景图
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [Algorithm][动态规划][01背包问题][目标和][最后一块石头的重量Ⅱ]详细讲解
  • [Android]使用Retrofit进行网络请求
  • [BSGS算法]纯水斐波那契数列
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C++]高精度 bign (重载运算符版本)