当前位置: 首页 > 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…...

TPA2016D2音频放大器Arduino驱动与AGC工程实践

1. 项目概述Adafruit TPA2016 Library 是一款专为 Texas Instruments TPA2016D2 音频功率放大器设计的 Arduino 兼容驱动库。该库封装了 IC 协议通信、寄存器配置、自动增益控制&#xff08;AGC&#xff09;参数调节及硬件复位管理等底层操作&#xff0c;使嵌入式开发者无需直接…...

“16QAM调制与解调系统的SystemView仿真及分析”

通信原理 systemview 16QAM调制与解调系统的仿真 16QAM调制解调系统与解调系统的仿真 用SystemView建立一个16QAM调制解调器电路,分析理解系统的各个模块功能&#xff0c;观察波形图 判断是不是实现了16QAM调制解调系统功能 基本要求: (1)在SystemView软 件中构建短波16QAM仿真…...

如何用嘎嘎降AI处理文献综述部分:综述专项降AI教程

如何用嘎嘎降AI处理文献综述部分&#xff1a;综述专项降AI教程 这篇教程来自实操经验。帮三个同学处理过论文AI率&#xff0c;加上自己的&#xff0c;前后操作了十几次。把流程总结成教程&#xff0c;尽量详细。 核心工具推荐嘎嘎降AI&#xff08;www.aigcleaner.com&#xf…...

别再只调参了!深入torchvision.datasets.CIFAR10源码,理解PyTorch数据加载的设计哲学

深入torchvision.datasets.CIFAR10源码&#xff1a;解码PyTorch数据加载的工程美学 当你第一次在PyTorch中写下torchvision.datasets.CIFAR10(root./data)这行代码时&#xff0c;是否想过这简单的调用背后隐藏着怎样的设计智慧&#xff1f;对于已经能够熟练调用各种数据集接口的…...

一台机器也能玩转StarRocks?手把手教你搭建单机测试环境(附避坑指南)

一台机器玩转StarRocks&#xff1a;单机测试环境搭建实战与避坑指南 当你想快速验证StarRocks的功能特性&#xff0c;或者进行本地开发测试时&#xff0c;单机部署是最便捷的选择。虽然官方并不推荐在生产环境中使用单机模式&#xff0c;但对于个人开发者、学生或测试场景来说&…...

突破企业AI应用开发瓶颈:Awesome-Dify-Workflow无代码解决方案深度剖析

突破企业AI应用开发瓶颈&#xff1a;Awesome-Dify-Workflow无代码解决方案深度剖析 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/…...

Scratch 3.0二次开发实战:从零构建自定义插件

1. 为什么需要自定义Scratch插件&#xff1f; Scratch作为全球最受欢迎的少儿编程工具&#xff0c;其模块化积木设计让编程学习变得直观有趣。但你可能遇到过这种情况&#xff1a;想做一个天气预报项目&#xff0c;却发现内置积木无法获取实时天气数据&#xff1b;或者想开发一…...

GIS数据处理避坑指南:如何一键批量转换KMZ/KML并保留所有字段(附工具下载)

GIS数据处理实战&#xff1a;KMZ/KML批量转换与属性保留全流程解析 在GIS数据处理工作中&#xff0c;KMZ和KML格式的批量转换是一个高频需求&#xff0c;但许多用户在实际操作中常遇到属性丢失、坐标系错乱等问题。我曾在一个城市交通规划项目中&#xff0c;因为转换后的属性字…...

告别重复造轮子:用快马平台高效生成Touchgal手势业务模块

告别重复造轮子&#xff1a;用快马平台高效生成Touchgal手势业务模块 在电商项目开发中&#xff0c;商品详情页的手势交互一直是提升用户体验的关键环节。最近在做一个移动端电商项目时&#xff0c;我需要为商品详情页实现完整的手势操作功能&#xff0c;包括图片缩放、滑动切…...

解密智能工具箱:如何用Snap Hutao高效管理你的原神游戏数据

解密智能工具箱&#xff1a;如何用Snap Hutao高效管理你的原神游戏数据 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Sna…...