Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理删除重复数据?_Python_Sqlite_Web Scraping_Scrapy_Data Integrity - Fatal编程技术网

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,是的。