聚合搜索平台数据抓取

本章内容

  1. 获取多种不同类型的数据源
    1. 文章(内部)
    2. 用户(内部)
    3. 图片(外部,不是我们自己的项目、自己的用户生产的数据)
  2. 前后端单独的搜索接口联调,跑通整个页面
  3. 分析现有项目的问题 => 优化,聚合接口的开发

获取不同类型的数据源

数据抓取流程

  1. 分析数据源(怎么获取?)
  2. 拿到数据后,怎么处理?
  3. 写入数据等存储

数据抓取的几种方式

  1. 直接请求数据结构(最方便) HttpClient、OkHttp、RestTemplate、Hutool(https://hutool.cn/)
  2. 等网页渲染出明文内容后,从前端页面的内容抓取
  3. 有一些网站可能是动态请求的,它不会一次性加载所有的数据,而是要你点击某一个按钮、输入某个验证码才会显示出数据。 => 无头浏览器: selenium、node.js puppeteer

注意:爬虫技术不能滥用,不能给别人的系统造成压力、不要侵犯他人权益!

1、获取文章

要是内部没有文章,可以从互联网上获取基础数据 => 爬虫

抓取:https://www.code-nav.cn/learn/passage

获取文章后要入库(定时获取或者只获取一次),离线抓取

2、用户获取

每个网站的用户基本都是自己的,一般无需从站外获取

3、图片获取

实时抓取:我们自己的网站不存储这些数据,用户要搜索的时候,直接从别人的接口(网站)去搜索

jsoup 库:获取到 HTML 文档,然后从中解析出需要的字段

现有业务场景分析

目前是在页面加载时,调用三个接口分别获取文章、图片、用户数据

几种不同的业务场景:

  1. 其他可以用户点某个 tab 的时候,只调用这个 tab 接口(如:https://www.code-nav.cn/search/all?current=2&pageSize=8&searchText=&sortField=_score&sortOrder=descend)
  2. 如果针对聚合内容的网页,其实可以一个请求搞定(如:https://tophub.today/)
  3. 有可能还有查询其他的信息,比如其他数据的总数,同时给用户反馈

根据实际情况自行选择

存在的问题:

  1. 请求数量比较多,可能会受到浏览器的限制
  2. 请求不同接口的参数可能不一样,增加前端沟通成本
  3. 前端写调用多个接口的代码,重复代码

聚合接口

  1. 请求数量比较多,可能会受到浏览器的限制 => 用一个接口请求完所有的数据(后端可以并发,几乎没有并发数量限制)

    1
    2
    3
    4
    5
    6
    {
    user = userService.query
    post = postService.query
    picture = pictureService.query
    return user + post + picture
    }
  2. 请求不同接口的参数可能不一样,增加前端沟通成本 => 用一个接口把请求参数统一,前端每次传固定的参数,后端去对参数进行转换

    1
    2
    3
    4
    {
    前端统一传 searchText
    后端把 searchText 转换为 userName => queryUser
    }

    统一返回结果:比如 Page 页面封装

  3. 前端写调用多个接口的代码,重复代码 => 用一个接口,通过不同的参数去区分查询的数据源

    1
    2
    3
    4
    {
    前端传 type 调用后端同一个接口,后端根据 type 调用不同的 service 查询
    比如:type = userService.query
    }

并发不一定更快!短板效应。要以实际为准