自己动手实现搜索引擎之数据采集

app采集的10个经典方法 app采集的抓取数据、app抓包、网页爬虫、采集网站数据、app数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么app采集数据的方法有哪些呢?我给大家分享一下,我爬虫的个人经验,我们在采集类似app采集网站数据的时候会遇到什么技术问题,然后再根据这些问题给大家分享采集方案. 写爬虫采集网站之前: 为什么经常听到有些网站的域名被劫持、服务器被黑客攻击、数据库被盗等 大家平时登录一个网站, 阅读详情

自己动手实现搜索引擎之数据采集

曾经在学生时代,就很想实现一个自己的搜索引擎,但当时没有这个技术,偶然的一个机会,有幸参加了王争老师的《数据结构与算法之美》的课程,在这个专栏里,我感觉通过几个月的练习,觉得自己的数据结构与算法,有了很大的进步,老师还特别分享了自己动手实现一个搜索引擎的原理以及关键的技术点,通过这个的学习,我了解了一个简单的搜索引擎的原理与实现,我也就将自己动手实现搜索引擎的技术实现分享出来。我将分为4个章节来介绍,分别是数据的采集,分析,索引,以及最后的搜索过程

 

首先是数的采集

简要流程

首先,数据要能搜索肯定要采集,如果把互联网比作一个海洋,那么数据就是海里的鱼,我们要怎么从海里去捞鱼呢?

此为一个简单的原理介绍:

 

搜索引擎把整个互联网看作是一个有向图,把每一个网页看作是一个顶点,如果一个网页存在另外一个网页的链接,那就添加一条有向边,这样我们就可以利用图的搜索算法,来搜索整个互联网。

具体到实现层页,我们可挑一些知名互联网网站,作为图的搜索起始顶点,使用图的广度搜索算法进行互联网的搜索,当爬取到一个网页,解析分析网页链接,将网页中的链接加入到图中,继续使用广度优先的遍历策略向外扩张搜索。

 

具体实现流程

 

 

 

现在来详细的说一说网页爬虫的处理流程

  1. 种子网页

种子网页这个可以这样理解:我们平时上网,经常会打开一些门户网站,例如,新浪,搜狐等等,这里也是一样的,我们就使用新浪作为种子网页开始进行搜索引擎的入口。

 

  1. 网页链接队列

此队列与我们平常使用的内存队列不一样,它是一个文件队列

我们所处理的网页链接是无限制的,经过多次爬虫爬取的网页链接可能已经超过了我们的内存大小了,所以需要采用文件队列来实现网页链接队列。

那网页链接如何存储在文件队列中呢?其实这个问题相对来说比较容易解决,我们可以按行进行网页链接的存储,即每次在网页链接队列中添加一个链接,就在数据的末尾添加一个换行符。针对读取来说使用一个偏移指针来记录下已经读取到的网页的位置,每次读取一个链接,就将偏移指针移动到读取到网页链接结束位置。

 

  1. 网页下载

这里网页下载可以直接使用已有的网络库直接下载,例如apache的网络库,

 

  1. 网页判重

网页判重使用布隆过滤器来实现,不过与标准的只在内存中存放数据的布隆过滤器不同,因为考虑到了服务需要重启的问题,需要将布隆过滤器中的数据持久化到磁盘中,以防数据丢失,我的实现方式是序列化,在需要保存时将数据通过JAVA提供的序列化机制持久到磁盘,当重新启动需要加载数据时,通过将磁盘中的数据反序列化到内存中,便可以直接使用。

受限于我机器的硬件条件,没有使用特别大的布隆过滤器,仅使用了10亿个位大小的char数组。也仅占用1百多M的内存

布隆过滤器如何实现网页的判重呢?

  使用一组hash函数对同一个网页计算hash值,就可以得到一组hash值,然后检查布隆过滤器中,这些hash值所在的位是否被占用,如果所有位都被占用,那么说明网页已经存在,相反,只要有一个没有被占用,说明网页没有被存储,可以继续流程处理。

那布隆过滤器有没有什么问题呢?

当然是有的,它存在误判的问题,虽然这个概率非常小,但是当数据接近于布隆过滤器的最大值时,误判的概率就会增大,虽然存在误判,仅限于已经存在的数据,如果布隆过滤器判断数据不存在,那数据肯定是不存在于布隆过滤器中的。但搜索引擎对于数据的要求没有那么严格,也就是必须要做到100%的无重复。它容忍一定的数据存在重复。

 

  1. 分配网页ID

此操作相对来说是个非常简单的操作,即实现一个自增长序列。但在程序关闭时需要将最后分配的id保存,下次可以继续处理。我的实现是采用java的AtomicLong来实现,通过CAS原子操作,避免了锁的开销,在多线程环境下,也是线程安全的。

 

  1. 存储网页id与网页链接至doc_id.bin文件中

下图为网页id与网页链接的行存储格式

 

 

  1. 原始网页存储

下图为原始网页的存储格式

 

 

分网页原始文件需有自动分折文件的能力,当一个文件满足一定的大小阈值后,自动可以将数据写入到下一文件中。我的实现方式是在doc_raw_xxxx.bin添加4位固定的数字编写,从0000开始,这样生成的文件就为doc_raw_0000.bin、doc_raw_0001.bin文件。

 

  1. 分析网页中的链接

针对一个网页来说,网页内容中存在着很多的网页链接,这就是一个循环处理网页链接的过程.

使用图来表示如下

 

  1. 从指定位置查找<a标签开始,使用的算法是KMP算法,这是一个非常高效的单模式串字符查找函数,通过它,可以很快速的找到<a标签开始的位置.
  2. 获取网页中需要过滤标签的位置,因为在网页中存在一些需处理的代码段,例如<script>,<!---->,它们都是中间如果包含了<a标签是不应该被处理的,所以需要将位置给找出来.
  3. 检查当前<a标签位置是否在需要过滤的位置中,如果是,则跳过当前循环,进行下一次查找,回到1,否则继续
  4. 获取网页链接内容信息并查找<a标签的结束位置,即</a>的位置。设置下次遍历的开始的位置。即结束位置开始
  5. 针对网页中的链接内容进行过滤。例如:以javascipr:为前缀的js方法,或者以#开始的锚,以.jpg,.ico,.png等常用的图片过滤,再就是邮件地址过滤,等等这些页内容如果规则如果满跳,则跳过当前的链接地址,否则,注释继续
  6. 如果网页中存在特殊的编码,则需要处理,例如空格,需要替换为%20
  7. 链接的处理,主要是针对一些特殊的网页链接,需要添加http://或者https
  8. 去布隆过滤器中去检查下是否已经存在此网页链接,如果存在,则跳过当前,进行下一次。否则继续
  9. 将当前已经处理完成的链接放入到当前网页的地址集合中

经过这些步骤的处理,一个网页中所有的网页链接就被提取出来了。

 

  1. 将链接加入到网页链接队列。

经过这些处理,一个网页的处理就结束了,然后就是一直不断进行链接地址的向外扩长。

 

 

这就是我自己实现搜索引擎的数据采集的处理。通过这个采集过程,我将图的广度遍历、布隆过滤器、KMP算法,AC自动机等算法应用于其中,觉得对我的算法的提高非常的有帮助,我也希望我的分享对你的能有所帮助。

 

最后我将代码贴出来

github地址:

https://github.com/kkzfl22/searchEngine/tree/master/src/main/java/com/liujun/search/engine/collect

 

 

 

基于Scrapy与Elasticsearch的免佣金房源垂直搜索引擎实战 垂直搜索引擎是一种针对特定领域或行业进行深度信息检索的技术系统。其核心原理在于通过聚焦的数据采集、结构化的索引构建和精准的查询匹配,为用户提供比通用搜索引擎更专业、更高效的搜索体验。在工程实践中,垂直搜索引擎的技术价值在于能够整合分散的行业数据,解决信息不对称问题,并可通过定制化算法优化搜索结果。典型的应用场景包括电商比价、招聘信息聚合、学术文献检索以及本地服务发现等。本文以构建一个聚合免佣金或低佣金房源的垂直搜索引擎为例,详细阐述了如何利用Scrapy框架进行数据抓取,并结合Elasticsearch实现 阅读详情

相关推荐

ES教程结合PLC实现监控联动

通过es教程掌握如何将ES与PLC结合,实现高效监控联动,提升工业自动化系统的响应速度与稳定性,是学习es教程和PLC集成应用的实用参考。

weixin_28931449的博客 1145

python爬虫增加多线程采集数据

Python爬虫对于现如今大数据满天飞的时代来说真是如虎添翼,也越来越多的领域喜欢用Python来实现数据采集。像 Scrapy、Request、BeautifuSoap、urlib等框架都可以实现自动爬虫。

weixin_44617651的博客 1158

ES7243音频ADC开发实战:I2C配置与I2S数据采集全解析

本文详细解析ES7243音频ADC芯片的开发实战,重点介绍I2C接口配置与I2S数据采集的全过程。通过硬件连接指南、寄存器配置详解及实际调试技巧,帮助开发者快速实现高质量音频采集,适用于智能音箱、会议系统等嵌入式应用。

q3r4s5t的博客 338

手动写一个搜索引擎(超详细)

搜索引擎是现代设备中被广泛利用的一种系统软件,诸如百度、谷歌、搜索、bing等,或者抖音、快手、b站、小红书,甚至软件应用市场,Windows(操作系统)中的各类提供搜索功能的背后都有搜索引擎的影子。

weixin_61567666的博客 1万+

从零实现Elasticsearch数据库访问——Kibana配置操作指南

掌握elasticsearch数据库怎么访问的关键步骤,通过Kibana配置实现高效数据查询与管理,适合初学者快速上手实践。

weixin_42612405的博客 825

Kibana监控集群状态实践:elasticsearch客户端工具项目应用

通过elasticsearch客户端工具实现对集群的实时监控与状态分析,结合Kibana可视化界面提升运维效率,有效保障服务稳定性。

weixin_32921023的博客 985

flume安装与监控部署

Flume概述 1)官网地址 http://flume.apache.org/ 2)日志采集工具 Flume是一种分布式,可靠且可用的服务,用于有效地收集,聚合和移动大量日志数据。它具有基于 流数据流的简单灵活的架构。它具有可靠的可靠性机制和许多故障转移和恢复机制,具有强大的容错 能力。它使用简单的可扩展数据模型,允许在线分析应用程序。 3)为什么需要flume 数据从哪里来? -》爬虫 -》日志...

开水烫鱼的博客 690

四大主流搜索引擎数据采集实操指南

在数字化时代,信息是宝贵的资源,而网络数据采集则是获取这些信息的重要途径。采集的目的通常是为了分析、监控和理解网络上的信息流动,以便更好地洞察用户行为、市场趋势或竞争对手的动态。对于IT行业而言,数据的准确性和时效性直接影响到产品的研发、市场策略的制定以及最终的商业决策。数据采集的重要性在于它为大数据分析提供基础。在没有充足数据支持的环境下,企业无法准确地识别问题、制定战略、优化产品或服务。而在网络上,大量的数据是开放且可访问的,它们可以成为决策的强大后盾。

weixin_42510201的博客 2426

自己动手——实现台达PLC远程监控数据采集

前言:台达PLC是一款国产优秀的可编程控制器,广泛应于工业控制领域,是一款性能高,运行稳定的控制器。此次我们要把台达DVP-ES系列PLC连接到EMCP物联网云平台(简称EMCP),实现电脑Web网页、手机APP和微信对台达PLC(D0/D1/Y0/Y2)寄存器的远程监控和D100和Y20的远程读写。 1.1在对接前我们需准备如下物品; 台达PLC一台(注意带COM2或3通讯串口),...

weixin_43286869的博客 6116

独立游戏开发者的新武器:实测腾讯混元3D自动绑骨,搭配Mixamo让角色动画制作效率翻倍

本文实测腾讯混元3D自动绑骨功能与Mixamo动画库的协同使用,显著提升独立游戏开发者的角色动画制作效率。通过解决卡通角色绑骨偏差、优化骨骼权重及动画状态机配置,使原本两周的流程缩短至三天,并分享Unity中的性能优化与版权合规要点。

weixin_42662605的博客 489

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 972

自己动手写搜索引擎

findlook 195

如何用DETR(detection transformer)训练自己的数据集

DETR(detection transformer)简介 DETR是Facebook AI的研究者提出的Transformer的视觉版本,是CNN和transformer的融合,实现了端到端的预测,主要用于目标检测和全景分割。 DETR的Github地址:link

weixin_50233398的博客 3万+

从0到1构建垂直搜索引擎:基于Search-Engines-Scraper的领域数据采集指南

Search-Engines-Scraper是一款强大的Python库,能够查询Google、Bing、Yahoo等多个搜索引擎并从结果页面收集数据,为构建垂直搜索引擎提供了坚实基础。本指南将带你了解如何利用这个工具快速搭建专属于特定领域的数据采集系统。 ## 📋 核心功能与优势 Search-Engines-Scraper的核心价值在于其**多引擎集成**和**灵活扩展**特性。该工具支持

gitblog_00617的博客 129

腾讯云智后台开发实习面试全纪录(已offer)

腾讯云智后台开发实习面经

wenwenaier的博客 5903

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2976

搜索引擎优化进阶:超越关键词频率的精准排序指标解析

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959951的博客 729

机器人强化学习入门学习笔记

如果你追求高精度动力学仿真、用于强化学习或机器人研究,MuJoCo 是一个非常优秀的选择。如果需要快速实验、使用真实机器人模型,PyBullet 或 Gazebo可能更合适;如果你追求大规模并行训练,Isaac Gym 或 BraX会更高效。legged gym底层是​编辑isaacgym,基于gpu训练可以多环境并行训练,收敛到一个稳定行走的策略快。本视频MuJoCo基于cpu训练很慢。

xiaomu_347的博客 1453

零基础搭建简易网盘搜索引擎:Python实战教程

最近想自己动手搭建一个简单的网盘搜索引擎,作为Python新手,花了两天时间研究并实现了一个基础版本。平台的一键部署功能特别适合这类Web项目,省去了配置服务器和环境的麻烦。作为新手,最头疼的环境问题就这样轻松解决了。整个项目代码不到200行,但涵盖了从数据采集到展示的完整流程。对于想学习Python Web开发的新手来说,是个很不错的练手项目。- 字段包括id(主键)、title(资源名)、url(链接)、size(文件大小)、source(来源)1. 分析目标网站的页面结构,找到资源列表的规律。

EmeraldWolf23的博客 526

手眼标定----眼在手上(eye-in-hand)

@TOC 标定之前你可以先拿个怡宝盖子进行测试。 第一步:打开halcon,采集,然后生成代码,显示十字架 第二步:把怡宝盖子放在十字架中心位置,在图像处理,找到怡宝盖子 第三步:找到怡宝盖子然后进行九点标定(眼在外帖子有讲),移动机器手然后分别拍9次照片,记录怡宝盖子坐标和当前机器坐标。这里移动到中心位置的时候记录一下单独记录一下坐标,等下要用。 顺序 第四步:拍完后利用vector_to_hom_mat2d算子求出矩阵,然后在利用write_tuple (HomMat2D, ‘路径’)进行保存。这里

苏州程序大白的博客 4280

基于Simulink的超级电容与锂电池混合储能协调控制仿真

摘要:本文介绍基于Simulink的光伏-混合储能系统(HESS)建模与仿真方法,通过超级电容和锂电池的协同控制实现功率平抑。系统采用直流耦合架构,利用一阶低通滤波法将总功率分解为低频(锂电池承担)和高频分量(超级电容承担),并设计SOC自平衡机制维持超级电容工作点。仿真结果表明,该方案可使锂电池电流波动降低62%,光伏功率波动率降至7.5%,有效延长电池寿命。文章详细展示了从主电路搭建、功率分配到闭环控制的完整实现步骤,为新能源系统储能优化提供实用参考。

amy_mhd的博客 136

【搜索引擎Jediael开发笔记1】搜索引擎初步介绍及网络爬虫

详细可参考 (1)书箱:《这就是搜索引擎》《自己动手写网络爬虫》《解密搜索引擎打桩实践》 (2)【搜索引擎基础知识1】搜索引擎的技术架构 (3)【搜索引擎基础知识2】网络爬虫的介绍 (一)搜索引擎的开发一般可分为以下三大部分 1、数据采集层:一般使用爬虫获取互联网的数据,重要的开源项目有Heritrxi 2、数据分析处理层:将从互联网上获取到的数...

apple01010105的博客 178

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

构建高效AI关键词素材库:从数据采集到实战应用

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959840的博客 1166

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

初学elasticsearch入门

文章目录1. 为什么学习elasticsearch?2. 达到目的,三个层面3. 如何学好?4. 从开源到上市5. elastic客户6. elastic简介7. Lucene起源8. elastic诞生9. ElasticSearch分布式架构10. 支持多种方式集成接入11. ElasticSearch主要功能12. Elastic的版本升级12.1 新特性5.X12.2 新特性6.X12.3 新特性 7.X13. elastic stack 生态圈14. logstash 数据处理管道15. kib

爱死亡机器人 942

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

对比研究:Yandex与百度搜索引擎的技术架构差异

最近在研究不同搜索引擎的技术特点,决定动手开发一个对比分析工具,用来可视化展示Yandex和百度两大搜索引擎的差异。使用D3.js创建了多种图表类型:柱状图对比响应时间,雷达图展示各项指标的差异,折线图显示不同查询条件下的表现变化。Yandex在俄语区的本地服务整合非常深入,而百度则更擅长连接中国本地的商业和服务资源。发现欧洲的GDPR和中国的个人信息保护法对两家公司的政策都有明显影响,但具体实施方式有所不同。对于想要了解搜索引擎技术差异的开发者,建议可以从这样的小项目入手,通过实际数据分析来加深理解。

SilvermistRaven28的博客 1338

计算机毕业设计之基于电影影评的垂直搜索引擎

本文探讨了大数据时代下电影影评垂直搜索引擎与信息管理系统的开发建设。研究从数据可视化角度出发,分析了传统与大数据环境下信息系统的差异,重点论述了爬虫技术在网站数据采集中的优势。通过设计数据采集方案和功能模块,实现了影评数据的可视化展示。文章最后针对系统优化提出了政策立法和信息反馈等建议,为同类系统的开发提供了参考。研究展示了大数据技术在垂直领域信息管理中的实际应用价值。

2401_87156169的博客 199
上一篇: 如何在单台8G内存机器上实现1TB日志排序?
下一篇: leetcode32-最长括号匹配-栈实现
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值