网站设计之路,哈尔滨seo推广公司,免费网页模板网站,静态网站建设参考文献很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候#xff0c;大家会用到python #xff0c;因为实现起来很方便。但是其实Node.js 用来爬取网络内容#xff0c;也是非常强大的。
今天我向大家介绍一下我自己写的一个百度新闻的爬虫#xff0c;可…很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候大家会用到python 因为实现起来很方便。但是其实Node.js 用来爬取网络内容也是非常强大的。
今天我向大家介绍一下我自己写的一个百度新闻的爬虫可以根据关键词爬取相应的资讯并将内功格式化。
源码已经发布在github上GitHub - guangboshushu/getBaiduNews: A crawler to fetch Baidu News data
代码可直接使用但仅供大家学习使用。
这个爬虫的代码是用来爬取百度新闻的使用了 axios 和 cheerio 这两个库来处理请求和解析 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 necessaryconst url https://www.baidu.com/s?rtt1bsst1cl2tnnewsrsv_dlns_pcword${_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-Agent 和 Cookie 作为请求头其中 Cookie 是用于模拟浏览器请求的避免百度反爬虫机制的限制。请求成功后调用 findParentDivOfH3 函数来解析返回的 HTML 内容并提取新闻信息。如果请求出错则在控制台输出错误信息。
4. 导出模块
module.exports getBdiduNews;这行代码将 getBdiduNews 函数导出使得其他文件可以使用 require 引入并调用这个函数。
5. 调用示例
getBdiduNews(小米手机).then(res {console.log(res)
});这里调用 getBdiduNews 函数传入关键词 小米手机然后使用 .then() 获取爬取结果并打印出来。结果就出来了 总结
该爬虫的功能是从百度新闻中抓取关键词相关的新闻信息并提取每条新闻的标题、链接、摘要、图片、发布时间、来源等信息。使用了 axios 发送请求cheerio 解析 HTML 内容且通过自定义函数处理页面中的数据提取。
希望这个分段介绍能帮助你更好地理解代码。这个爬虫是给你用来学习的记得要注意合法性避免侵犯百度的服务条款。