Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

设计更合理的数据校验与人工复审机制,减少脏数据对数据使用方的影响 #571

Open
ZKLlab opened this issue Feb 14, 2023 · 2 comments

Comments

@ZKLlab
Copy link
Member

ZKLlab commented Feb 14, 2023

问题背景

  • 此项目的爬虫从学校的排课网站爬取课程列表的表格内容,爬取的数据用于 SHU 排课助手(以下简称排课助手)。由于排课助手的架构原因,爬虫脏数据可能会对排课助手的数据造成不可逆的副作用,例如被删除的课程会从用户的待选列表中移除,上课时间修改后如果与其他已选课程时间冲突则会被取消选择等。因此,有必要保留数据校验和人工复审机制,确保数据结构的正确性,减少脏数据对排课助手用户的影响。
  • 目前已有一个 term_diff 函数将上次结果和当前结果进行比较,得到增加、修改、删除的数组。此前存在、现在被禁用的数据校验机制是对可能产生副作用的主要字段修改,和全部增加与删除变动标记为需要人工复审,创建 Pull Request 进行手工合并。这个方案存在需要人工复审的频率过高的问题,使数据更新效率受限,但在长期使用中,也确实发现了一些由于学校网站改版导致的脏数据问题,成功避免了脏数据进入排课助手。因此,我们需要设计更合理的数据校验和人工复审机制,防止脏数据污染,同时节省人工复审的频率。

需求

  • 设计并实现一个更合理的数据校验和人工复审机制,能够检测到表格结构变动等原因导致的脏数据,减少人工复审的频率。
  • 由于脏数据通常只来自网站表格结构的变化,因此可以通过变更的数据量判断是否需要复审。
  • 爬虫脏数据会对使用方 SHU 排课助手造成不可逆的副作用,需要尽可能避免脏数据。

实现思路

  • 对比结果:is_major_update 函数中,可将 term_diff 的结果用 is_major_change 函数进行筛选,得到需要进行校验的数据变动,对增加、修改、删除的变动进行计数。

  • 根据各类型变动的数目进行处理:

    • 对于增加数据的变动,可以不需要人工复审,或设定一个阈值,对大比例突增的情况标记需要人工复审;
    • 对于修改数据的变动,可以设定一个阈值,例如原数据量的 75%,当修改的数量大于阈值时,则认为发生了数据结构变化,标记需要人工复审;
    • 对于删除数据的变动,可以设定一个阈值,例如原数据量的 25%,当删除的数量大于阈值时,则认为爬虫运行可能遇到了异常,标记需要人工复审。

通过以上机制,我们可以在保证数据质量的前提下,减少人工复审的频率,提高更新效率。

进一步改进

  • 我们可以在爬虫处优化代码或增加校验,例如对学校排课网站的表头进行校验,发现表格结构的变化,从而直接标记需要人工复审。
  • 目前 Pull Request 没有展示主要变动内容的摘要,只能通过 File changes 观察,人工复审时查看数据比较麻烦;下一步可增加自动生成 Markdown 摘要,使变动内容更直观展示。
  • 另一种思路,是否可以通过理解并识别爬虫结果的方式,预先定义一些字段的规则对数据进行校验。
@ZKLlab
Copy link
Member Author

ZKLlab commented Feb 14, 2023

@ENDsoft233 @chinggg 人工复审的校验规则有保留的必要性,这个改进思路看看是否可行

@ZKLlab
Copy link
Member Author

ZKLlab commented Feb 14, 2023

关联 #565 #570

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant