如何使用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,我们可以提高爬虫的效果,避免被目标网站屏蔽或限制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何高效地设计测试用例并评审

编写出好的测试用例是每一个测试工程师的职责,但在实际工作中大家写的测试用例往往需要不断地修改才能使用,这不仅浪费了时间,还容易让测试工程师产生自我否定的情绪,甚至在团队中产生各种矛盾。 那如何高效地设计测试用例呢&…

Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

使用http库进行简单的网络请求时,运行在Chrome浏览器上,网络请求一直报错 XMLHttpRequest error,而在iOS 模拟器上运行则正常,后面在postman上发送请求,也是正常的。这就是很尴尬了!!&#xff0…

计算机竞赛 基于机器视觉的手势检测和识别算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

ruoYi添加子模块,访问子模块服务404

一 问题 在ruoYi项目中,添加了一个子模块,在里面创建了几个服务,调用时发现总是404 二 解决 1. 父pom添加该子模块 2.ruoyi-admin项目关联该子模块

自动化运维:Ansible基础与命令行模块操作

目录 一、理论 1. Ansible 2.部署Ansible自动化运维工具 3.Ansible常用模块 4.hostsinverntory主机清单 二、实验 1.部署Ansible自动化运维工具 2.ansible 命令行模块 3.hostsinverntory主机清单 三、问题 1. ansible远程shell失败 2.组变量查看webservers内主机ip报…

Android studio 软件git使用

在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…

Python 的画图函数 seaborn 简介

seaborn 简介 seanborn 是 Python 的另外一个常用工具包,它基于 matplotlib,但画出的图形更加美观些,并且与 Pandas 的数据类型结合地较好。 # Import seaborn import seaborn as sns import matplotlib.pyplot as plt# Apply the default …

Android 热修复核心原理

dexopt 在Dalvik中虚拟机在加载一个dex文件时,对 dex 文件 进行 验证 和 优化的操作,其对 dex 文件的优化结果变成了 odex(Optimized dex) 文件,这个文件和 dex 文件很像,只是使用了一些优化操作码。 dex2oat ART 预先编译机制&a…

创建型模式-建造者模式

使用多个简单的对象一步一步构建成一个复杂的对象 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部…

Redis之stream类型解读

目录 基本介绍 数据结构 消息 消费组 消费者 基本使用命令 概述 xadd 命令 xtrim 命令 xdel 命令 xlen 命令 xrange 命令 xread 命令 xgroup 命令 xreadgroup 命令 xack 命令 基本介绍 Redis stream(流)是一种数据结构,其…

uniapp接入广告的问题总结

Uniapp官方解决方案 uni-app 支持接入uni-ad广告联盟,开发者可实现一次开发,多端变现。 uni-ad 支持开屏、信息流、激励视频、视频流、悬浮红包、推送等丰富的广告形式; uni-ad 聚合了全网所有主流广告源,包括腾讯优量汇、字节…

【数学建模竞赛】各类题型及解题方案

评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理(都越多越好或越少越少)->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…

【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

在单片机开发中,UART、I2C、RS485等普遍在用,这里做一个简单的介绍 UART通用异步收发器 UART口指的是一种物理接口形式(硬件)。 UART是异步(指不使用时钟同步,依靠帧长进行判断),全双工(收发…

【Axure高保真原型】中继器网格图片拖动摆放

今天和大家分享中继器网格图片拖动摆放的原型模板,我们可以通过鼠标拖动来移动图片,拖动过程其他图标会根据图片拖动自动排列,松开鼠标是图片停放在指定位置,其他图标自动排列。那这个模板是用中继器制作的,所以使用也…

Redis——》Pipeline

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

内嵌功能强大、低功耗STM32WB55CEU7、STM32WB55CGU7 射频微控制器 - MCU, 48-UFQFN

一、概述: STM32WB55xx多协议无线和超低功耗器件内嵌功能强大的超低功耗无线电模块(符合蓝牙 低功耗SIG规范5.0和IEEE 802.15.4-2011标准)。该器件内含专用的Arm Cortex -M0,用于执行所有的底层实时操作。这些器件基于高性能Arm …

想与一个大佬探讨一下,他网站说的先验分布、后验分布,似乎不对?

2_probability 我对这个问题,是这么理解的: 几个网友,一开始都和我持不同的观点。感觉这是最基本的抽样检验问题啊。。。。。。。。。。。。。。。。。。。

Mybatis学习笔记(三)——Mybatis的配置(Mybatis-config.xml)

Mybatis学习笔记(三)——Mybatis的配置(Mybatis-config.xml) 传送门:Mybatis中文网——配置 Mybatis配置文档的顶层结构: configuration(配置) properties(属性&#…

Linux用户与组管理(03)(八)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、组管理 1、概述 2、用户信息查看 总结 前言 今天是学习用户与组管理的最后一节课,这节课主要是组管理的内容,希望能一起学习&#xff…

C# 生成唯一ID

1.首先通过nuget安装yitter.idgenerator 下面的三行代码搞定