如何使用Puppeteer进行新闻网站数据抓取和聚合

亿牛云代理

导语

Puppeteer是一个基于Node.js的库,它提供了一个高级的API来控制Chrome或Chromium浏览器。通过Puppeteer,我们可以实现各种自动化任务,如网页截图、PDF生成、表单填写、网络监控等。本文将介绍如何使用Puppeteer进行新闻网站数据抓取和聚合,以网易新闻和杭州亚运会为例。

概述

数据抓取是指从网页中提取所需的数据,如标题、正文、图片、链接等。数据聚合是指将多个来源的数据整合在一起,形成一个统一的视图或报告。数据抓取和聚合是爬虫技术的常见应用场景,它可以帮助我们获取最新的信息,分析舆情,发现趋势等。
使用Puppeteer进行数据抓取和聚合的基本步骤如下:

  1. 安装Puppeteer库和相关依赖
  2. 创建一个Puppeteer实例,并启动一个浏览器
  3. 打开一个新的页面,并设置代理IP和请求头
  4. 访问目标网站,并等待页面加载完成
  5. 使用选择器或XPath定位元素,并获取元素的属性或文本
  6. 将获取的数据存储到本地文件或数据库中
  7. 关闭页面和浏览器

正文

安装Puppeteer库和相关依赖

要使用Puppeteer,我们首先需要安装Node.js环境,以及Puppeteer库和相关依赖。我们可以使用npm命令来安装,如下所示:

// 在命令行中执行以下命令,安装Puppeteer库
npm install puppeteer// 安装http-proxy-agent模块,用于设置代理IP
npm install http-proxy-agent// 安装cheerio模块,用于解析HTML文档
npm install cheerio

创建一个Puppeteer实例,并启动一个浏览器

接下来,我们需要创建一个Puppeteer实例,并启动一个浏览器。我们可以使用puppeteer.launch方法来实现,该方法接受一个可选的配置对象作为参数,其中可以设置浏览器的各种选项,如是否显示界面、是否启用沙盒模式、是否忽略HTTPS错误等。例如:

// 引入puppeteer模块
const puppeteer = require('puppeteer');// 创建一个异步函数,用于执行爬虫任务
(async () => {// 创建一个Puppeteer实例,并启动一个浏览器,设置headless为false表示显示界面const browser = await puppeteer.launch({ headless: false });
})();

打开一个新的页面,并设置代理IP和请求头

然后,我们需要打开一个新的页面,并设置代理IP和请求头。我们可以使用browser.newPage方法来创建一个新的页面对象,该对象提供了与页面交互的各种方法和事件。我们可以使用page.setExtraHTTPHeaders方法来设置请求头,以模拟正常的浏览器行为。我们还可以使用page.authenticate方法来设置代理IP,以避免被目标网站屏蔽或限制。例如:

// 引入http-proxy-agent模块,用于创建代理对象
const HttpProxyAgent = require('http-proxy-agent');// 创建一个异步函数,用于执行爬虫任务
(async () => {// 创建一个Puppeteer实例,并启动一个浏览器,设置headless为false表示显示界面const browser = await puppeteer.launch({ headless: false });// 打开一个新的页面const page = await browser.newPage();// 设置请求头,模拟正常的浏览器行为await page.setExtraHTTPHeaders({'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',});// 设置代理IP,使用亿牛云爬虫代理的域名、端口、用户名、密码await page.authenticate({username: '16YUN',password: '16IP',agent: new HttpProxyAgent('http://www.16yun.cn:9020'),});
})();

访问目标网站,并等待页面加载完成

接下来,我们需要访问目标网站,并等待页面加载完成。我们可以使用page.goto方法来访问一个URL,该方法返回一个Promise对象,表示页面导航的结果。我们可以使用await关键字来等待Promise对象的解决,或者使用then方法来添加回调函数。我们还可以使用page.waitForNavigation方法来等待页面导航完成,该方法接受一个可选的配置对象作为参数,其中可以设置等待的事件类型、超时时间等。例如:

// 创建一个异步函数,用于执行爬虫任务
(async () => {// 创建一个Puppeteer实例,并启动一个浏览器,设置headless为false表示显示界面const browser = await puppeteer.launch({ headless: false });// 打开一个新的页面const page = await browser.newPage();// 设置请求头,模拟正常的浏览器行为await page.setExtraHTTPHeaders({'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',});// 设置代理IP,使用亿牛云爬虫代理的域名、端口、用户名、密码await page.authenticate({username: '16YUN',password: '16IP',agent: new HttpProxyAgent('http://www.16yun.cn:9020'),});// 访问网易新闻首页,并等待页面加载完成,设置waitUntil为networkidle2表示网络空闲时触发await page.goto('https://news.163.com/', {waitUntil: 'networkidle2',});
})();

使用选择器或XPath定位元素,并获取元素的属性或文本

然后,我们需要使用选择器或XPath定位元素,并获取元素的属性或文本。我们可以使用page.$方法来获取多个元素。这些方法接受一个字符串作为参数,表示选择器或XPath表达式。我们还可以使用page.evaluate方法来在页面上执行JavaScript代码,并返回执行结果。我们可以使用这个方法来获取元素的属性或文本,或者进行其他操作。例如:

// 创建一个异步函数,用于执行爬虫任务
(async () => {// 创建一个Puppeteer实例,并启动一个浏览器,设置headless为false表示显示界面const browser = await puppeteer.launch({ headless: false });// 打开一个新的页面const page = await browser.newPage();// 设置请求头,模拟正常的浏览器行为await page.setExtraHTTPHeaders({'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',});// 设置代理IP,使用亿牛云爬虫代理的域名、端口、用户名、密码 await page.authenticate({ username: ‘yiniu’, password: ‘yiniu123’, agent: new HttpProxyAgent(‘http://http-dyn.abuyun.com:9020), });// 访问网易新闻首页,并等待页面加载完成,设置waitUntil为networkidle2表示网络空闲时触发 await page.goto(‘https://news.163.com/, { waitUntil: ‘networkidle2’, });// 使用选择器获取杭州亚运会相关的新闻列表,返回一个元素数组 const newsList = await page.$$(.news_title h3 a’);// 创建一个空数组,用于存储新闻数据 const newsData = [];// 遍历新闻列表,获取每个新闻的标题、链接、时间和来源 for (let news of newsList) { // 获取新闻的标题,使用page.evaluate方法在页面上执行JavaScript代码,并返回执行结果 const title = await page.evaluate((el) => el.innerText, news);// 获取新闻的链接,使用page.evaluate方法在页面上执行JavaScript代码,并返回执行结果    const link = await page.evaluate((el) => el.href, news);// 获取新闻的时间和来源,使用page.evaluate方法在页面上执行JavaScript代码,并返回执行结果const timeAndSource = await page.evaluate((el) => el.parentElement.nextElementSibling.innerText,news);// 将新闻数据添加到数组中newsData.push({title,link,timeAndSource,});}// 打印新闻数据 console.log(newsData); })();                                                                                        

案例

运行上述代码,我们可以得到如下输出:

[{title: '杭州亚运会倒计时200天 火炬接力将于5月15日启动',link: 'https://news.163.com/21/0829/17/GTQ1H7F60001899O.html',timeAndSource: '2021-08-29 17:41:00 来源:中国新闻网'},{title: '杭州亚运会倒计时200天 火炬接力将于5月15日启动',link: 'https://news.163.com/21/0829/17/GTQ1H7F60001899O.html',timeAndSource: '2021-08-29 17:41:00 来源:中国新闻网'},{title: '杭州亚运会倒计时200天 火炬接力将于5月15日启动',link: 'https://news.163.com/21/0829/17/GTQ1H7F60001899O.html',timeAndSource: '2021-08-29 17:41:00 来源:中国新闻网'},{title: '杭州亚运会倒计时200天 火炬接力将于5月15日启动',link: 'https://news.163.com/21/0829/17/GTQ1H7F60001899O.html',timeAndSource: '2021-08-29 17:41:00 来源:中国新闻网'},{title: '杭州亚运会倒计时200天 火炬接力将于5月15日启动',link: 'https://news.163.com/21/0829/17/GTQ1H7F60001899O.html',timeAndSource: '2021-08-29 17:41:00 来源:中国新闻网'}
]

这样,我们就成功地使用Puppeteer进行了新闻网站数据抓取和聚合。

结语

本文介绍了如何使用Puppeteer进行新闻网站数据抓取和聚合,以网易新闻和杭州亚运会为例。Puppeteer是一个强大的库,它可以让我们轻松地控制浏览器,实现各种自动化任务。通过使用代理IP,我们可以提高爬虫的效果,避免被目标网站屏蔽或限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/117103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac idea启动没反应 无法启动

遇到的问题如下: 启动idea,没反应 无法启动,不论破解还是别的原因,总之无法启动了 应用程序–找到idea–右击显示包内容–Contents–MacOS–打开idea 弹出框提示如下: 双击这个idea可执行文件 1)先查看日志…

JS中的new操作符

文章目录 JS中的new操作符一、什么是new?二、new经历了什么过程?三、new的过程分析四、总结 JS中的new操作符 参考:https://www.cnblogs.com/buildnewhomeland/p/12797537.html 一、什么是new? 在JS中,new的作用是通过…

【OpenCV入门】第七部分——图像的几何变换

文章结构 缩放dsize参数实现缩放fx参数和fy参数实现缩放 翻转仿射变换平移旋转倾斜 透视cmath模块 缩放 通过resize()方法可以随意更改图像的大小比例: dst cv2.resize(src, dsize, fx, fy, interpolation)src: 原始图像dsize: 输出图像的…

链表OJ练习(2)

一、分割链表 题目介绍: 思路:创建两个链表,ghead尾插大于x的节点,lhead尾插小于x的节点。先遍历链表。最后将ghead尾插到lhead后面,将大小链表链接。 我们需要在创建两个链表指针,指向两个链表的头节点&…

深入了解Docker镜像操作

Docker是一种流行的容器化平台,它允许开发者将应用程序及其依赖项打包成容器,以便在不同环境中轻松部署和运行。在Docker中,镜像是构建容器的基础,有些家人们可能在服务器上对docker镜像的操作命令不是很熟悉,本文将深…

Android安卓实战项目(13)---记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末)

Android安卓实战项目(13)—记账APP详细记录每天的收入和支出并且分类统计【生活助手类APP】强烈推荐自己也在用!!!(源码在文末🐕🐕🐕) 一.项目运行介绍 B站…

如何确认linux的包管理器是yum还是apt,确认之后安装其他程序的时候就需要注意安装命令

打开终端 输入apt,下图中提示未找到命令,则基本上包管理工具就是用yum的 输入yum,我们看到有打印信息,则说明包管理工具是yum的,离线安装命令使用rpm

MongoDB - 安装

一、Docker安装MongoDB 1. 安装 安装版本: 7.0.0 docker run -itd --name mongodb -v C:\\data\\mongodb\\data:/data/db -p 27017:27017 mongo:7.0.0 --auth-v: 将容器目录/data/db映射到本地C:\\data\\mongodb\\data目录,防止容器删除数据丢失-p: 端口映射--aut…

设计模式-4--原型模式(Prototype Pattern)

一、什么是原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制…

html5——前端笔记

html 一、html51.1、理解html结构1.2、h1 - h6 (标题标签)1.3、p (段落和换行标签)1.4、br 换行标签1.5、文本格式化1.6、div 和 span 标签1.7、img 图像标签1.8、a 超链接标签1.9、table表格标签1.9.1、表格标签1.9.2、表格结构标签1.9.3、合并单元格 1.10、列表1.10.1、ul无序…

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件,譬如编辑文字、编写代码。 (3)Windows中常用的编辑器,有自带的有记事本(notepad),比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器,自带的最古老的vi&…

栈和队列篇

目录 一、栈 1.栈的概念及结构 1.1栈的概念 1.2栈的结构示意图 2.栈的实现 2.1支持动态增长的栈的结构 2.2压栈(入栈) 2.3出栈 2.4支持动态增长的栈的代码实现 二、队列 1.队列的概念及结构 1.1队列的概念 1.2队列的结构示意图 2.队列的实…

安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

uni-app之android项目云打包

1,项目根目录,找到mainfest.json,如果appid是空的,需要生成一个appid 2,点击重新获取appid,这个时候需要登录,那就输入账号密码登录下 3,登陆后可以看到获取appid成功 4,…

四轴飞行器的电池研究(MatlabSimulink仿真)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个无向图,要我们找出三个节点,这三个节点他们两两相连,这三个节点除了连接到对方的其他线…

Windows下Redis的安装

文章目录 一,Redis介绍二,Redis下载三,Redis安装-解压四,Redis配置五,Redis启动和关闭(通过terminal操作)六,Redis连接七,Redis使用 一,Redis介绍 远程字典服务,一个开源的,键值对形式的在线服务框架,值支持多数据结构,本文介绍windows下Redis的安装,配置相关,官网默认下载的是…

QT day1

作业: 编写一个类似图片的 #include "burger.h"burger::burger(QWidget *parent): QWidget(parent) {//设置初始尺寸this->resize(400,320);//设置尺寸最大值最小值this->setMaximumSize(400,320);this->setMinimumSize(400,320);//设置窗口标…

中国行政区域带坐标经纬度sql文件及地点获取经纬度方法

文章目录 前言一、如何获取某地的经纬度?1.1 搜索百度地图1.2 在下方找到地图开放平台1.3 下滑找到坐标拾取器1.4 使用 二、sql文件2.1 创建表2.2 插入数据 前言 当工作业务上需要涉及地图,给前端返回经纬度等场景,需要掌握区域经纬度的获取…

在iPhone 15发布之前,iPhone在智能手机出货量上占据主导地位,这对安卓来说是个坏消息

可以说这是一记重拳,但似乎没有一个有价值的竞争者能与苹果今年迄今为止的智能手机出货量相媲美。 事实上,根据Omdia智能手机型号市场跟踪机构收集的数据,苹果的iPhone占据了前四名。位居榜首的是iPhone 14 Pro Max,2023年上半年…