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 内容,且通过自定义函数处理页面中的数据提取。

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

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

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

相关文章

csv文件的上传、解析和获得最后的数据

前端和node端解析、读取csv文件的区别 1、前端 运行环境为浏览器&#xff0c;受到浏览器安全策略的限制&#xff0c;例如跨域请求、文件访问权限等。对于大型CSV文件的处理可能会受到性能瓶颈的影响。前端运行在用户的浏览器中&#xff0c;受到浏览器安全策略的限制&#xff…

JavaScript(一)

1.JavaScript 基本使用 2.JavaScript简单事件 3.JavaScript修改样式 4.JavaScript数据类型 JavaScript和Java有什么关系 知识点一 JavaScript基本使用 JS写在哪 还有一种写在中间的&#xff0c;也就是<head>里面 JS一些注意事项 JS修改元素内容 #JS获取对象<…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

基于Java Springboot校园论坛APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开…

深度学习基础03_BP算法(下)过拟合和欠拟合

目录 一、BP算法(下) 0、反向传播代码回顾 写法一&#xff1a; 写法二(更常用)&#xff1a; 1、BP中的梯度下降 1.数学描述 2.传统下降方式 3.优化梯度下降方式 指数加权平均 Momentum AdaGrad RMSProp Adam(常用) 总结 二、过拟合和欠拟合 1、概念 1.过拟合 …

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将 pdf 文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需…

Apache Doris 现行版本 Docker-Compose 运行教程

特别注意&#xff01;Doris On Docker 部署方式仅限于开发环境或者功能测试环境&#xff0c;不建议生产环境部署&#xff01; 如有生产环境或性能测试集群部署诉求&#xff0c;请使用裸机/虚机部署或K8S Operator部署方案&#xff01; 原文阅读&#xff1a;Apache Doris 现行版…

1.Git安装与常用命令

前言 Git中会用到的一些基本的Linux命令 ls/ll 查看文件目录 (ll可以看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 1.下载与安装 安装成功后鼠标右键会出现Git Bash和Git GUI Git GUI&#xff1a;GUI图形化界面 Git Bash&#xff1a;Git提供的命令行工具 当安装…

A058-基于Spring Boot的餐饮管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

【AI系统】Ascend C 语法扩展

Ascend C 语法扩展 Ascend C 的本质构成其实是标准 C加上一组扩展的语法和 API。本文首先对 Ascend C 的基础语法扩展进行简要介绍&#xff0c;随后讨论 Ascend C 的两种 API——基础 API 和高阶 API。 接下来针对 Ascend C 的几种关键编程对象——数据存储、任务间通信与同步…

【合作原创】使用Termux搭建可以使用的生产力环境(二)

前言 上期文章没看的可以先从上期文章开始看起 【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;一&#xff09;-CSDN博客 目前我们已经完成了FinalShell ssh连接手机Termux的功能了&#xff0c;这期我们继续朝我们的目标前进。今天早上有读者进群以为生成环境指…

UG NX二次开发(C#)-选择对象居中(不是全部居中)

文章目录 1、前言2、什么是对象居中3、功能实现代码3.1 对象居中3.1 恢复原视图1、前言 在UG NX二次开发过程中,我们经常会用到居中以查看完整的模型,但是对于如果想展示某些对象,而不是全部模型时,那么我们就想将选择的对象(如体对象)居中查看,当查看结束后还能恢复到…

群控系统服务端开发模式-应用开发-短信工厂七牛云短信开发

一、七牛云短信工厂开发 1、添加框架对应的SDK composer require qiniu/php-sdk 2、添加七牛云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下&#xff0c;创建七牛云短信发送工厂并命名为QiniuyunSmsSender。记住&#xff0c;一定要在七牛云短信发送工厂类名后面去…

机器学习概述,特征工程简述2.1——2.3

机器学习概述&#xff1a; 1.1人工智能概述 达特茅斯会议—人工智能的起点 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 1.1.2 机器学习和深度学习能做什么 传统预测 图像识别 自然语言处理 1.2什么是机器学习 数据 模型 预测 从历史数…

基于vite6+ vue3 + electron@33 实现的 局域网内互传文件的桌面软件

目录 项目介绍项目部分截图介绍下基础项目搭建先搭建一个vite 前端项目 再安装 electron 相关依赖依赖安装失败解决方案修改 vite配置文件和 ts 配置文件修改packjsonts相关配置项目结构介绍 项目介绍 前端 基于 vue3 ts windicss 后端 就是node 层 项目地址&#xff1a; h…

Linux 内核系统架构

Linux 内核是一个复杂且高度模块化的系统&#xff0c;负责操作硬件资源、管理进程和内存、提供网络服务、执行文件系统操作、进行设备驱动程序的管理等。它为用户空间提供了一个抽象层&#xff0c;并为应用程序提供了底层服务。本文将深入探讨 Linux 内核的系统架构&#xff0c…

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

计算机网络——不同版本的 HTTP 协议

介绍 HTTP&#xff0c;即超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;是应用层的一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

Fastapi + vue3 自动化测试平台---移动端App自动化篇

概述 好久写文章了&#xff0c;专注于新框架&#xff0c;新UI界面的实践&#xff0c;废话不多说&#xff0c;开搞 技术架构 后端&#xff1a; Fastapi Airtest multiprocessing 前端&#xff1a; 基于 Vue3、Vite、TypeScript、Pinia、Pinia持久化插件、Unocss 和 Elemen…

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…