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

做网站优化费用/seo公司推广宣传

做网站优化费用,seo公司推广宣传,wordpress修改头像,我也来做外国网站购物很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实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…...

Java面试八股文(精选、纯手打)

全国内大厂Java面试高频题库 本小册内容涵盖&#xff1a;Java基础&#xff0c;JVM&#xff0c;多线程&#xff0c;数据库&#xff08;MySQL/Redis&#xff09;SSM&#xff0c;Dubbo&#xff0c;网络&#xff0c;MQ&#xff0c;Zookeeper&#xff0c;Netty&#xff0c;微服务&a…...

工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作

在工程设计行业&#xff0c;文件交换和信息共享是项目顺利推进的关键。尤其是涉及复杂的设计图纸、技术方案、合同文件等重要资料时&#xff0c;如何确保文件在内外网之间的高效、安全传输&#xff0c;直接影响到项目的进度和质量。FileLink正是为此而生&#xff0c;它为工程设…...

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…...

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持&#xff0c;如果服务需要使用apns推送等需要http2.0的访问就会失败&#xff0c;所以重新编译php让其支持http2.0 编译方法&#xff1a; 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…...

Redis服务配置文件 redis.conf 更新修改配置参数说明

场景&#xff1a; 在安装redis服务中&#xff0c;默认的配置项通常不能实际使用&#xff0c;需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件&#xff0c;此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容&#xff0c;主要修改项如下 protect…...

Android 俩个主题的不同之处 “Theme.AppCompat vs android:Theme.Material.Light.NoActionBar”

这两种主题继承关系有明显的不同&#xff0c;具体区别如下&#xff1a; Theme.AppCompat vs android:Theme.Material.Light.NoActionBar Theme.AppCompat 是 AppCompat 支持库提供的主题&#xff0c;目的是提供向后兼容的支持&#xff0c;适用于较早版本的 Android&#xff08…...

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…...

vscode ctrl+/注释不了css

方式一.全部禁用插件排查问题. 方式二.打开首选项的json文件,注释掉setting.json,排查是哪一行配置有问题. 我的最终问题:需要将 "*.vue": "vue",改成"*.vue": "html", "files.associations": { // "*.vue": &qu…...

《山海经》:北山

《山海经》&#xff1a;北山 北山一经单狐山求如山&#xff08;水马&#xff1a;形状与马相似&#xff0c;滑鱼&#xff1a;背部红色&#xff09;带山&#xff08;䑏疏&#xff1a;似马&#xff0c;一只角&#xff0c;鵸鵌&#xff1a;状乌鸦五彩斑斓&#xff0c;儵鱼&#xff…...

oracle中删除指定前缀的表

近期接手做的项目&#xff0c;发觉数据库中有许多多余的表。究其原因&#xff0c;应该是同事贪图方便&#xff0c;将过去做过的项目复制粘贴&#xff0c;然后修修改改。包括数据库也是克隆过来的&#xff0c;然后又没有删除本项目多余的表&#xff0c;结果经过几个轮回&#xf…...