二、聚合搜索平台数据抓取
聚合搜索平台数据抓取
本章内容
- 获取多种不同类型的数据源
- 文章(内部)
- 用户(内部)
- 图片(外部,不是我们自己的项目、自己的用户生产的数据)
- 前后端单独的搜索接口联调,跑通整个页面
- 分析现有项目的问题 => 优化,聚合接口的开发
获取不同类型的数据源
数据抓取流程
- 分析数据源(怎么获取?)
- 拿到数据后,怎么处理?
- 写入数据等存储
数据抓取的几种方式
- 直接请求数据结构(最方便) HttpClient、OkHttp、RestTemplate、Hutool(https://hutool.cn/)
- 等网页渲染出明文内容后,从前端页面的内容抓取
- 有一些网站可能是动态请求的,它不会一次性加载所有的数据,而是要你点击某一个按钮、输入某个验证码才会显示出数据。 => 无头浏览器: selenium、node.js puppeteer
注意:爬虫技术不能滥用,不能给别人的系统造成压力、不要侵犯他人权益!
1、获取文章
要是内部没有文章,可以从互联网上获取基础数据 => 爬虫
抓取:https://www.code-nav.cn/learn/passage
获取文章后要入库(定时获取或者只获取一次),离线抓取
2、用户获取
每个网站的用户基本都是自己的,一般无需从站外获取
3、图片获取
实时抓取:我们自己的网站不存储这些数据,用户要搜索的时候,直接从别人的接口(网站)去搜索
jsoup 库:获取到 HTML 文档,然后从中解析出需要的字段
现有业务场景分析
目前是在页面加载时,调用三个接口分别获取文章、图片、用户数据
几种不同的业务场景:
- 其他可以用户点某个 tab 的时候,只调用这个 tab 接口(如:https://www.code-nav.cn/search/all?current=2&pageSize=8&searchText=&sortField=_score&sortOrder=descend)
- 如果针对聚合内容的网页,其实可以一个请求搞定(如:https://tophub.today/)
- 有可能还有查询其他的信息,比如其他数据的总数,同时给用户反馈
根据实际情况自行选择
存在的问题:
- 请求数量比较多,可能会受到浏览器的限制
- 请求不同接口的参数可能不一样,增加前端沟通成本
- 前端写调用多个接口的代码,重复代码
聚合接口
请求数量比较多,可能会受到浏览器的限制 => 用一个接口请求完所有的数据(后端可以并发,几乎没有并发数量限制)
1
2
3
4
5
6{
user = userService.query
post = postService.query
picture = pictureService.query
return user + post + picture
}请求不同接口的参数可能不一样,增加前端沟通成本 => 用一个接口把请求参数统一,前端每次传固定的参数,后端去对参数进行转换
1
2
3
4{
前端统一传 searchText
后端把 searchText 转换为 userName => queryUser
}统一返回结果:比如 Page 页面封装
前端写调用多个接口的代码,重复代码 => 用一个接口,通过不同的参数去区分查询的数据源
1
2
3
4{
前端传 type 调用后端同一个接口,后端根据 type 调用不同的 service 查询
比如:type = userService.query
}
并发不一定更快!短板效应。要以实际为准
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 墨枫个人博客!
评论