首页 文章

如何处理抓取重复数据?

提问于
浏览
0

我正在从另一个站点抓取数据,我经常处理如下情况:

EntityA
    IdEntityB
    IdEntityC

EntityB
    IdEntityD
    IdEntityE

上面提到的每个实体都有自己的页面,我想将它们插入到SQL数据库中 . 但是,我废弃物品的顺序并不是最佳 . 到目前为止我的解决方案(没有处理外键或任何类型的映射)已经废弃 EntityA 的页面,查找其相应的 EntityB 页面的链接并安排该页面也被删除 . 同时, all 将被抓取的实体一起抛入bin中,然后我将其插入到数据库中 . 出于性能原因,我等到我有大约2000个实体被刮掉以将所有这些实体推送到数据库中 . 天真的方法是只插入每个身份而没有唯一的身份,但这意味着我将不得不使用其他(非数字)低质量信息来引用系统上的每个实体 . 当我无法将所有实体拼凑在一起时,如何保证数据库中有干净的数据?这是使用Python和Scrapy框架 .

1 回答

  • 3

    在抓取网站的情况下,通常避免冗余的主要因素是跟踪已经被抓取的网址 . 在你的mysql中有一个表,你只需要抓取的页面的网址(或网址的md5或sha1哈希) . 使用表中的该列创建索引 .

    在刮取任何页面之前检查mysql表是否已经删除它 . 这将是一个选择查询,并不会加载mysql太多 . 我知道你因为性能问题而以批量方式写入db,但是这个选择不会加载mysql那么多 . 如果您使用多个线程,只需观察并监视与mysql的连接,并在必要时更改配置 .

    但更好的方法是使用具有3列结构的表,如下所示:

    id  | url | crawled_flag
    

    这里在此表中创建一个带 url 的索引,并使其唯一 . 所以网址不会多余 . 首先,当您刮取页面时,请将该行的 crawled_flag 设为 true . 然后解析页面并获取此页面中的所有链接,并使用 crawled_flag 作为 false 插入此表 . 如果该表中已存在该url,则插入将失败,因为我们将 url 列设置为 unique . 你的下一个scrape应该是 crawled_flagfalse 的行的url,这个循环继续 . 这将避免由于冗余URL导致的数据冗余 .

相关问题