Python 如何处理删除重复数据?
我正在从另一个站点抓取数据,我经常处理以下情况:Python 如何处理删除重复数据?,python,sqlite,web-scraping,scrapy,data-integrity,Python,Sqlite,Web Scraping,Scrapy,Data Integrity,我正在从另一个站点抓取数据,我经常处理以下情况: EntityA IdEntityB IdEntityC EntityB IdEntityD IdEntityE 上面提到的每个实体都有自己的页面,我想将它们插入到SQL数据库中。但是,我报废物品的顺序不是最佳顺序。到目前为止,我的解决方案(没有处理外键或任何类型的映射)是废弃EntityA的页面,查找指向其相应EntityB页面的链接,并安排该页面也被删除。同时,所有的被刮取的实体被扔到一个箱子里,然后被插入到
EntityA
IdEntityB
IdEntityC
EntityB
IdEntityD
IdEntityE
上面提到的每个实体都有自己的页面,我想将它们插入到SQL数据库中。但是,我报废物品的顺序不是最佳顺序。到目前为止,我的解决方案(没有处理外键或任何类型的映射)是废弃
EntityA
的页面,查找指向其相应EntityB
页面的链接,并安排该页面也被删除。同时,所有的被刮取的实体被扔到一个箱子里,然后被插入到数据库中。出于性能方面的原因,我会等到刮取了大约2000个实体后,才将它们全部推送到数据库中。天真的方法是只插入每个标识,而不插入唯一的标识,但这意味着我必须使用一些其他(非数字)质量较低的信息来引用系统上的每个实体。当我不能将所有实体拼凑在一起时,如何保证数据库中有干净的数据?这是使用Python和Scrapy框架。在抓取网站的情况下,通常避免冗余的主要因素是跟踪已经抓取的URL。在mysql中有一个表,其中只包含您所抓取的页面的URL(或URL的md5或sha1散列)。使用表中的该列创建索引
在刮取任何页面之前,请检查mysql表中是否已经刮取了该页面。这将是一个select查询,不会加载太多mysql。我知道由于性能问题,您正在以批处理的方式写入数据库,但是这个选择不会加载那么多mysql。如果您使用多个线程,只需观察和监视到mysql的连接,并在必要时更改配置
但更好的方法是使用3列结构的表,如下所示:
id | url | crawled_flag
在这里,使用此表中的
url
创建一个索引,并使其唯一。这样url就不会是多余的。首先,在刮取页面时,将该行的crawled\u标志设置为true
。然后解析该页面并获取该页面中的所有链接,并将爬网标志
作为假
插入该表。这里,如果该url已经存在于表中,则insert将失败,因为我们已将url
列设置为唯一的。您的下一个抓取应该是带有crawled\u标志
为false
的行的url,并且此循环将继续。这将避免由于冗余URL而导致的数据冗余。您是指刮取/刮取吗?报废就是扔掉,或者扔掉:)“我们报废了那个项目,因为它成本太高了。”你说的干净数据是什么意思。?你能再解释一下吗。?你是指冗余,比如你可能会将同一个页面废弃两次或者其他什么。我是指冗余,比如数据库中的重复数据。冗余页面的URL会不同吗。?还是相同的?应该是相同的URL,是的。