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

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。

今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可以根据关键词爬取相应的资讯,并将内功格式化。

源码已经发布在github上:GitHub - guangboshushu/getBaiduNews: A crawler to fetch Baidu News data

代码可直接使用,但仅供大家学习使用。

这个爬虫的代码是用来爬取百度新闻的,使用了 axioscheerio 这两个库来处理请求和解析 HTML 页面。下面是分段介绍每个部分的功能:

1. 引入依赖包

const axios = require('axios'); 
const cheerio = require('cheerio');
  • axios: 用于发送 HTTP 请求,这里用来向百度发送 GET 请求获取新闻页面内容。
  • cheerio: 用于解析返回的 HTML 内容,类似于 jQuery,可以通过选择器查找元素并提取数据。
  • Cheerio 是一个强大的 HTML 解析工具,它类似于 jQuery,可以通过选择器来查找元素并提取数据。cheerio 会将返回的 HTML 内容解析成一个类似 DOM 的结构,并将其转化为一个 jQuery 风格的对象,可以使用标准的 DOM 操作方法(如 .find().text().attr() 等)对 HTML 元素进行操作和提取。由于它基于 jQuery 的 API,使用起来非常直观,且性能上比浏览器中的 DOM 操作要高效很多,特别适合用于服务器端的 HTML 内容解析。

    更准确的细节:

  • HTML 解析cheerio 并不像浏览器中的 DOM 那样提供完整的浏览器环境,它专注于快速解析 HTML 文本,并提供类似 jQuery 的接口供操作。这使得它在 Node.js 环境中非常轻量且高效。
  • 对象模型cheerio 并不会生成完整的 DOM 树,而是将 HTML 解析成一个类似 DOM 结构的对象,便于操作和查询。它的 API 是基于 jQuery 核心的,使用方法和操作非常熟悉。
  • 序列化和提取:你可以通过 cheerio 序列化或遍历 HTML 标签,提取你需要的数据,比如文本、属性值,或者修改 HTML 元素。

2. 自定义函数 findParentDivOfH3

这个函数是用来解析百度新闻的内容的。在解析内容前,需要分析百度的网页结构,打开浏览器访问网页,然后查看源码即可。这里需要稍微有一点html的尝试,比如dom的结构 css的标签等等。这些挺简单的。

比如按照关键词查找  小米手机  

网页结构如下,这里现找到标题<h3>的标签,再往上找到它的父DOM,就是一条完整的News DOM。

需要注意的是如果以后百度新闻网页结构变化了 需要调整。

下面是函数源码:

function findParentDivOfH3(html) {const $ = cheerio.load(html);const results = [];$('h3').each(function () {const parentDiv = $(this).closest('div');if (parentDiv.length > 0) {const title = $(this).find("a[aria-label^='标题:']").text().trim();const titleUrl = $(this).find("a[aria-label^='标题:']").attr("href");const leftImgSrc = parentDiv.find("img").first().attr("src");const hasImg = leftImgSrc ? true : false;const summary = parentDiv.find(".c-font-normal.c-color-text").text().trim();const dispTime = parentDiv.find(".c-color-gray2.c-font-normal").text().trim();const sourceIcon = parentDiv.find(".source-img_33bs5").attr("src");const sourceName = parentDiv.find(".news-source_Xj4Dv span.c-color-gray").text().trim();const rtses = parentDiv.find(".news-source_Xj4Dv span.c-color-gray").text().trim();results.push({title,titleUrl,leftImgSrc,hasImg,summary,dispTime,sourceIcon,rtses,sourceName});}});return results;
}

功能:

  • 该函数接收一个 HTML 字符串,使用 cheerio 来解析 HTML 内容。
  • 查找所有 <h3> 标签,通过 .closest('div') 获取每个 <h3> 标签的父级 <div> 元素。
  • 从每个父 <div> 元素中提取出以下信息:
    • 新闻标题(title
    • 新闻链接(titleUrl
    • 左侧图片的 srcleftImgSrc
    • 是否有图片(hasImg
    • 摘要(summary
    • 发布时间(dispTime
    • 来源图标(sourceIcon
    • 来源名称(sourceName
    • 转载数(rtses
  • 将这些信息存入 results 数组,并返回。

3. 获取百度新闻的函数 getBdiduNews


const getBdiduNews = (keyWord) => {const _keyWord = encodeURIComponent(keyWord);const cookies = 'Here are your cookies if necessary'const url = `https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=${_keyWord}`;return axios.get(url, {headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Cookie': cookies}}).then(response => {return (findParentDivOfH3(response.data));}).catch(error => {console.error('Error:', error);});
}

功能:

  • getBdiduNews 函数接收一个关键词 keyWord,然后将其进行 URL 编码(encodeURIComponent),用于构造百度新闻的查询 URL。
  • 发送一个 GET 请求到百度新闻搜索页面,使用 axios 发送请求,设置 User-AgentCookie 作为请求头(其中 Cookie 是用于模拟浏览器请求的,避免百度反爬虫机制的限制)。
  • 请求成功后,调用 findParentDivOfH3 函数来解析返回的 HTML 内容,并提取新闻信息。
  • 如果请求出错,则在控制台输出错误信息。

4. 导出模块

module.exports = getBdiduNews;
  • 这行代码将 getBdiduNews 函数导出,使得其他文件可以使用 require 引入并调用这个函数。

5. 调用示例

getBdiduNews('小米手机').then(res => {console.log(res)
});
  • 这里调用 getBdiduNews 函数,传入关键词 '小米手机',然后使用 .then() 获取爬取结果并打印出来。
  • 结果就出来了:

总结:

  • 该爬虫的功能是从百度新闻中抓取关键词相关的新闻信息,并提取每条新闻的标题、链接、摘要、图片、发布时间、来源等信息。
  • 使用了 axios 发送请求,cheerio 解析 HTML 内容,且通过自定义函数处理页面中的数据提取。

希望这个分段介绍能帮助你更好地理解代码。这个爬虫是给你用来学习的,记得要注意合法性,避免侵犯百度的服务条款。

相关文章:

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候&#xff0c;大家会用到python &#xff0c;因为实现起来很方便。但是其实Node.js 用来爬取网络内容&#xff0c;也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫&#xff0c;可…...

106.【C语言】数据结构之二叉树的三种递归遍历方式

目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…...

qt QToolButton详解

1、概述 QToolButton是Qt框架中的一个控件&#xff0c;它继承自QAbstractButton。QToolButton通常用于工具栏&#xff08;QToolBar&#xff09;中&#xff0c;提供了一种快速访问命令或选项的方式。与普通的QPushButton按钮相比&#xff0c;QToolButton通常只显示一个图标而不…...

2024年大热,Access平替升级方案,也适合Excel用户

欢迎各位看官&#xff0c;您来了&#xff0c;就对了&#xff01; 您多半是Access忠实粉丝&#xff0c;至少是excel用户&#xff0c;亦或是WPS用户吧。那就对了&#xff0c;今天的分享肯定对您有用。 本文1100字&#xff0c;阅读时长2分50秒&#xff01; 现实总是不尽人意&am…...

探索Scala的模式匹配:身份证识别与等级判定!!! #Scala # scala #匹配模式

在Scala编程语言中&#xff0c;模式匹配是一个强大且表达力丰富的特性&#xff0c;它允许我们以声明式的方式处理多种情况。今天&#xff0c;我们将通过两个有趣的例子来展示Scala模式匹配的魅力&#xff1a;身份证号识别和等级判定。 1. 身份证号识别&#xff1a;定位你的家乡…...

python数据分析之爬虫基础:爬虫介绍以及urllib详解

前言 在数据分析中&#xff0c;爬虫有着很大作用&#xff0c;可以自动爬取网页中提取的大量的数据&#xff0c;比如从电商网站手机商品信息&#xff0c;为市场分析提供数据基础。也可以补充数据集、检测动态变化等一系列作用。可以说在数据分析中有着相当大的作用&#xff01;…...

【星海随笔】syslinux

Ubuntu相关资料 https://www.pugetsystems.com/labs/hpc/ubuntu-22-04-server-autoinstall-iso/#Step_2_Unpack_files_and_partition_images_from_the_Ubuntu_2204_live_server_ISO https://launchpad.net/ubuntu/source/squashfs-tools/1:4.6.1-1build1 sudo tar -xf my_compu…...

力扣C语言刷题记录 (二)移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a; 更改…...

【Vue3】【Naive UI】<NAutoComplete>标签

【Vue3】【Naive UI】标签 <NAutoComplete> 是 Naive UI 库中的一个组件&#xff0c;用于实现自动完成或联想输入功能。 它允许用户在输入时看到与当前输入匹配的建议列表&#xff0c;从而帮助用户更快地填写表单字段。 这个组件通常用于搜索框、地址输入等场景&#xff…...

【Halcon】使用均值滤波出现假边怎么办?

在图像处理过程中,均值滤波是一种常见的平滑技术,用于减少图像中的噪声。然而,当应用于具有显著边缘或对比度变化的图像时,均值滤波可能会导致“假边”现象,即原本不存在的边缘在滤波后变得明显。以下是如何在Halcon中处理这一问题,并提供一个完整的示例代码。 示例背景…...

Flask+Minio实现断点续传技术教程

什么是MinIO MinIO是一个高性能的分布式对象存储服务&#xff0c;与Amazon S3 API兼容。它允许用户存储和检索任意规模的数据&#xff0c;非常适合于使用S3 API的应用程序。MinIO支持多租户存储&#xff0c;提供高可用性、高扩展性、强一致性和数据持久性。它还可以作为软件定义…...

JAVA设计模式,动态代理模式

动态代理&#xff08;Dynamic Proxy&#xff09;是Java中一种非常有用的设计模式。它允许在运行时创建一个实现了一组给定接口的新类。这种模式主要用于当需要为某个对象提供一个代理以控制对该对象的访问时。通过这种方式&#xff0c;可以添加额外的功能&#xff0c;如事务管理…...

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…...

【计算机视觉算法与应用】模板匹配、图像配准

目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…...

详解Rust多线程编程

文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全&#xff0c;同时避免运行时的开销&…...

el-upload上传多个文件,一次请求,Django接收

1、:file-list"fileList" :on-change"handleChange" 将文件赋值到fileList 2、 :auto-upload"false" 手动触发上传 写个按钮点击执行这个 this.$refs.upload.submit(); 3、自己写上传&#xff0c;不会再触发上传成功或失败回调 4、 request.FI…...

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…...

《JavaScript高级程序设计》读书笔记 20

感谢点赞、关注和收藏&#xff01; 原始值包装类型 为了方便操作原始值&#xff0c;ECMAScript 提供了 3 种特殊的引用类型&#xff1a;Boolean、Number 和 String。每当用到某个原始值的方法或属性时&#xff0c;后台都会创建一个相应原始包装类型的对象&#xff0c;从而暴露…...

ASP.NET Core项目中使用SqlSugar连接多个数据库的方式

之前学习ASP.NETCore及SqlSugar时都是只连接单个数据库处理数据&#xff0c;仅需在Program文件中添加ISqlSugarClient的单例即可&#xff08;如下代码所示&#xff09;。 builder.Services.AddSingleton<ISqlSugarClient>(s > {SqlSugarScope sqlSugar new SqlSugar…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...