Elastic 网络爬虫:为你的网站添加搜索功能

作者:来自 Elastic Lionel Palacin

为了演示如何使用 Elastic 网络爬虫,我们将以一个具体的网站为例,讲解如何在该网站上添加搜索功能。我们将探讨发现网站的方法,并利用 Elastic 网络爬虫提供的功能,以最佳方式准备待搜索的数据。

在本文中,我们将使用 Elastic Cloud 8.13 版本。

有关网络爬虫的更多内容,请详细阅读:

  • Enterprise:Web Crawler 基础 (一)(二)
  • ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

Elastic 网络爬虫

是一个开箱即用的工具,使用户能够抓取网站内容并将其导入 Elasticsearch。

Elastic 网络爬虫从访问入口点 URL 开始每次爬取。从这里开始,爬虫获取网页内容并提取之。HTML 文档被转换成搜索文档并进行索引。

然后,它会跟随该页面指向的任何链接,遵守用户定义的规则集。使用相同的方法访问新的 URL,直到爬虫索引了所有可访问的网页。如果一个网页没有链接指向,爬虫就无法找到它。

网站发现

首次爬取

我们将以 “Books to Scrape” 网站作为爬取的简单网站示例,这是一个提供书籍信息选择的网站,专门为测试网络爬虫而设计。

如果你使用的是 Elastic Cloud,设置非常简单,因为 Elastic 网络爬虫是开箱即用的。如果你管理自己的 Elastic 部署,请确保检查此页面以了解需求。

让我们从 Kibana 首页开始。从那里,导航到搜索解决方案,然后创建一个新的网络爬虫。

为索引提供一个名称,在我们的例子中是 search-books,并在下一个屏幕中输入主网站 URL:https://books.toscrape.com/。然后验证域名,并等待执行一些检查,以确保该域名可以被爬取。

在这一点上,让我们通过点击 “Crawl => Crawl all domains” 来使用默认配置爬取网站。这样做,我们将看到正在被爬取的链接以及如何为每个网页索引文档。

查看文档列表时,我们会看到一些类别页面也被爬取了,但我们对这些页面不感兴趣,因为我们只想爬取书籍详情页面。

另外一个我们在展开书籍文档时注意到的问题是,书籍的价格或摘要在 body_content 字段中混合在一起。这使得这些重要信息在搜索查询中不易使用。

定义爬取规则

从我们的第一次爬取中,我们注意到 category 页面也被爬取了,而我们对它们不感兴趣,所以让我们将它们排除在爬取之外。

在爬取规则下,添加一个新规则来禁止爬取以路径模式 /catalogue/category/ 开头 (Begins with) 的页面。

现在我们可以在新规则生效的情况下重新进行一次爬取。

注意:作为探索过程的一部分,每次更改网络爬虫配置时,我建议删除内容。在最后一章 “准备生产部署” 中,我们将看到如何在不手动删除数据的情况下重新运行网络爬虫。

# Delete all documents
POST search-books/_delete_by_query
{"query": {"match_all": {}}
}

丰富数据

默认情况下,Elastic 网络爬虫使用默认模式从网页中提取所有信息。例如,HTML 标签 <title> 被提取到字段 title 中,而 <body> 标签被提取到字段 body_content 中。这是一个很好的基础,但大多数情况下,我们希望自定义数据的提取方式,并且丰富数据以在搜索应用程序中使用。

从自定义字段中提取数据

查看文档被索引的方式时,我们注意到我们想要将书籍摘要和价格分别提取到它们自己的字段中。

在探索新网站时,通常会自定义爬虫从网页中提取内容的方式,为此,提取规则是一个很好的工具。

使用浏览器检查工具,我们可以看到哪个 HTML 标签包含价格文本,这里是一个带有 class=price_color 的 HTML 标签 <p>。

提取规则使用 CSS 选择器或 XPath 来识别网页中的特定元素。我们可以使用浏览器控制台来测试它们。

要尝试 XPath,我们可以使用函数 $x。例如,要返回书籍摘要节点,我们可以在浏览器控制台中运行 $x("//article[@class='product_page']/p")[0]。

要尝试 CSS 选择器,我们可以使用 document.querySelectorAll。例如,要使用 CSS 选择器选择价格,我们可以在浏览器控制台中运行:document.querySelectorAll("div.product_main p.price_color")[0]。

根据我们在浏览器控制台测试的内容,让我们创建一个提取规则来添加两个新字段:summary 和 price。

提取规则

  • 名称:书页规则
  • 适用于所有 URL
  • 第一个字段:
    • Field name:summary
    • source:从 HTML 元素中提取内容
    • CSS 选择器://article[@class='product_page']/p
    • Content:使用从提取值中提取的内容
    • 将提取的内容存储为字符串
  • 第二个字段:
    • 字段名称:price
    • source:从 HTML 元素中提取内容
    • CSS 选择器:div.product_main p.price_color
    • Content:使用从提取值中提取的内容
    • 将提取的内容存储为字符串

数据摄取管道用于转换数据

通常,从网页提取的数据格式并不完全适合用于搜索引擎。在我们的例子中,我们已经将书籍价格单独提取到一个 price 字段中,但如果仔细观察,会发现它被索引为字符串:“£18.03”,这并不理想,因为它不便于执行比较搜索(例如,获取所有价格低于 20 英镑的书籍)或聚合操作(例如,计算科幻书的平均价格)。

为了在数据摄取时进行一些小的转换,我们可以使用 Elasticsearch 中的摄取管道。有许多处理器可用于执行不同的任务,在我们的案例中,我们将使用脚本处理器执行一个自定义函数,该函数将为每个被索引的文档执行,去除价格中的第一个字符,仅保留数字部分。

要管理摄取管道,请转到 Pipelines 标签页,点击 “Copy and Customize”,然后点击 “编辑管道” 按钮开始编辑摄取管道。

在那里添加一个脚本处理器,使用以下代码:

ctx['price_float'] = ctx['price'].substring(1)

保存所有更改,然后返回到网络爬虫索引配置页面。

我们添加的脚本将在摄取时创建一个名为 price_float 的新字段。我们需要编辑索引映射以提供正确的字段类型,在我们的情况下,我们希望将其索引为浮点型。

打开控制台并执行以下代码以更新索引映射:

# Add a new field with a type float
PUT search-books/_mapping
{"properties": {"price_float": {"type": "float"}}
}

现在我们可以删除索引中的所有文档,然后再次运行爬取。所有文档中都会存在一个名为 price_float 的新字段,其类型为浮点型。

启用语义搜索的机器学习推理管道

我们可以使用的另一种管道是推理管道,它允许我们在被索引的数据上运行机器学习模型。

在我们的案例中,我们希望利用 Elastic 的专有机器学习模型 ELSER,该模型能够对任何英语文本启用语义搜索。

返回到 Pipelines 标签页,向下滚动到 Machine Learning Inference Pipelines 部分。如果还未部署和启动 ELSER 模型,此处可以进行部署和启动。

然后,通过单击 “Add Inference Pipeline” 按钮添加一个新的推理管道。在第一个屏幕上选择 ELSER 模型,然后转到下一个屏幕,在那里选择推理管道的输入和输出字段。在我们的案例中,我们想要在图书 summary 上启用语义搜索。我们选择该字段并将其添加到列表中。

完成配置后,我们可以删除所有文档并再次运行网络爬虫。

测试查询

当我们使用提取规则和摄入管道配置网络爬虫后,我们的文档很容易进行搜索。

让我们看一个查询示例,该查询对书籍摘要执行语义搜索,并包含基于书籍价格的过滤器。

# Find books over £50 that talks about "Wars and family succession struggle on dry planets"
POST search-books/_search
{"_source": ["title", "summary", "price", "url"],"query": {"bool": {"should": [{"text_expansion": {"ml.inference.summary_expanded.predicted_value": {"model_id": ".elser_model_2_linux-x86_64","model_text": "Wars and family succession struggle on dry planets"}}}],"filter": [{"range": {"price_float": {"gte": 50}}}]}}
}

准备生产部署

在本章中,我们将讨论在将网络爬虫投入生产时一些重要的网络爬虫特性。

定时任务

由于网站经常更新,保持 Elasticsearch 中的数据与网站同步更新可能很重要。为此,我们可以利用 Elastic 网络爬虫的调度功能,定期爬取网站。

Elastic 网络爬虫会自动检测自上次爬取以来网页是否已更新,并将在 Elasticsearch 中更新相应的文档。如果自上次爬取以来某个网页已被删除,则该文档也将从 Elasticsearch 中删除。

受保护的网站

另一个有用的功能是能够爬取非公开可用或位于认证后的网站。

此文档详细解释了如何爬取位于私有网络中的网站。

如果访问特定网页需要认证,我们可以在域配置屏幕下的认证部分添加凭据或特定头部。

总结

在这篇博客文章中,我们看到了如何从头到尾发现一个新网站进行爬取,如何利用 Elastic 网络爬虫的功能准备数据以用于搜索应用,以及最后如何准备将其部署到生产环境。

如果你有兴趣了解更多关于 Elastic 摄入能力的信息,请查看其他开箱即用的连接器。如果你想在 GenAI 应用程序中使用摄入数据,请查看我们的教程。

准备在你的应用中构建 RAG 吗?想尝试不同的 LLMs 与向量数据库吗? 查看我们在 Github 上的 LangChain、Cohere 等示例笔记本,并加入即将开始的 Elasticsearch工程师培训!

原文: Elasticsearch open inference API adds support for OpenAI chat completions — Elastic Search Labs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML、CSS常用的vscode插件 +Css reset 和Normalize.css

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍HTML、CSS常用的vscode插件&#x1f34e;1 HTML 标签同步重命名 – Auto Re…

【Java网络编程】网络编程中的基本概念及实现UDP、TCP客户端服务器程序

目录 一、什么是网络编程&#xff1f; 二、网络编程中的基本概念 1. 客户端和服务器 2. 请求和响应 三、Socket套接字 UDP数据报套接字编程 1. DatagramSocket 2. DatagramPacket 3. UDP回显客户端服务器程序 4. UDP字典客户端服务器程序 TCP流套接字编程 1. Serve…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本&#xff0c;翻教程的时候发现很多SpringBoot2.x版本用的都是springfox&#xff0c;但问题是在SpringBoot3.x版本后&#xff0c;逐渐不支持springfox&#xff0c;强行启动会导致异常&#xff0c;现阶段使用的Springdoc进行替换。 参考…

Java多线程-API

常见API一览 Thread t1 new Thread(() -> {System.out.println("我是线程t1");System.out.println("Hello, World!"); }); t1.start(); // 获取线程名称 getName() // 线程名称默认是Thread-0, Thread-1, ... System.out.println(t1.getName());// 通过…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机&#xff0c;这就需要从操作系统中申请一片内存区域。JVM申请到内存之后&#xff0c;会把这个内存划分为几个区域&#xff0c;每个区域都有各自的作用。 一般会把内存划分为四个区域&#xff1a;方法区(也称 "…

【网站项目】党员之家服务系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 说明&#xff1a;本次实验的代码使用verilog编写&#xff0c;文章中为阅读方便&#xff0c…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章&#xff0c;指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识&#xff0c;这节只是简单了解一下指针&#xff0c;并不会深…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样&#xff1a; 想要把取到的数据展示成图片&#xff0c;那么你可以这样做&#xff1a; // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

路由器热备份

HSRP HSRP&#xff08;Hot Standby Routing Protocol&#xff09;热备份路由选择协议 HSRP是思科私有的协议&#xff0c;HSRP起到一个双网关热备份的一个目的&#xff0c;不考虑线路问题针对设备而言&#xff0c;一个设备挂了还有另外一台设备&#xff0c;所以双网关也叫双机…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分…

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码&#xff1a;4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC)&#xff0c;支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理&#xff0c;最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成&#xff1a;微型工业计算机&#xff0c;显示终端&#xff08;平板电视、LCD&#xff09; 方案需求 …

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

【c++】vector的使用

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;我们本篇来到一个新的容器&#xff0c;vector的讲解和使用 目录 1.vector简单介绍2.vector的使用2.1构造函数2.2遍历vector2.3对容量操作2.4vector的增删查改 1.v…

Java测试编程题

题目1 1.创建5个线程对象 线程名设置为&#xff08;Thread01&#xff0c;Thread02&#xff0c;Thread03&#xff0c;Thread04&#xff0c;Thread05&#xff09;使用 代码实现5个线程有序的循环打印&#xff0c;效果如下&#xff1a; Thread01正在打印1 Thread02正在打印2 Threa…

Day60 单调栈 part03

Day60 单调栈 part03 最后一天啦&#xff01;完结撒花~ 84.柱状图中最大的矩形 我的思路&#xff1a; 感觉和接雨水差不多&#xff0c;只需要多考虑一些情况 双指针 lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。 解答&#xff1a; class Solutio…

齐次变换矩阵、欧拉角

齐次变换矩阵 因为老是忘记齐次变换矩阵的含义以及方向&#xff0c;每次推导公式都很费劲&#xff0c;写下这篇文章用于快速回顾齐次变换矩阵。 表示的是&#xff1a;坐标系A到坐标系B的齐次变换矩阵&#xff0c;也是坐标系B在坐标系A下的位姿。 对于这个矩阵&#xff0c;有三…

Matlab软件使用教学

1. Matlab简介 Matlab&#xff08;Matrix Laboratory的缩写&#xff09;是一种由MathWorks公司开发的数值计算和可视化编程环境。它广泛应用于工程、科学研究、数学和教育等领域&#xff0c;因其强大的计算能力和丰富的工具箱而受到青睐。 2. 安装与启动 安装&#xff1a;从M…

贪心算法(一)

什么是贪心算法&#xff1f;&#xff1f;&#xff1f; 贪心算法是指通过每一次都选择最优解情况&#xff0c;然后通过局部最优从而达到全局最优&#xff0c;简单理解为目光短浅&#xff0c;走一步看一步。 需要注意的是&#xff0c;贪心算法是一种思想&#xff0c;而非直接的…