听说你的爬虫一直在整站里循环绕圈圈爬取重复的数据? 2019-06-01 python3爬虫教程 今天小帅b要跟你说说增量爬虫是这样的当你去爬取某个网站的数据时你会发现这些网站随着时间的推移会更新更多的网页数据这时候你要爬取的是那些更新的网页数据而不是又一次爬取整站的内容对于一些稍微复杂点的网站它们的 url 之间会指来指去如果你根据 url 的定向去爬取可能会出现这种情况你的爬虫一直在里面绕圈圈一直爬取重复的数据这时候你的爬虫开始陷入了对人生的大思考那么如何确保爬取的数据不要重复?接下来就是学习 python 的正确姿势有朋友说那就直接用数据库呗在爬取前把 url 存入数据库下次爬取的时候再到数据库里面查询看下这个 url 是否存在数据库如果存在那就说明这个 url 之前已经被爬取过了如果不存在就把 url 保存到数据库中这种方式虽然可行但是如果数量一多查询速度就会大大降低从而影响爬取效率了其实python 中有一个我们熟悉的数据结构setset 里面的元素是唯一不重复的所以我们可以将 url 塞进去下次通过 in 来判断就可以了因为它的平均复杂度为 O(1)这样就比数据库的操作高效很多了但是这种方式有一个问题使用 python 的 set是作用于内存的一旦 url 的数量增多就会很耗内存不知道你还记得咱们之前说的这个如果你怕文件被篡改,那就这样做在这里面咱们说到了 hash通过散列可以生成唯一的指纹那么这时候我们可以使用 url 进行 hash比如进行 MD5 加密由于 MD5 值所占的内存更小 所以可以通过 MD5 来降低 url 的内存也就是说直接把 url 进行 MD5然后把得到的 MD5 放进 set 就好了可以做到缩短 url 的长度来降低内存的消耗当然了还有与之类似的redisredis 中也有和 Python 相似的 set我们可以使用它来存储 url 的 MD5这种缓存数据库的优点在于它可以作用于硬盘不会有消耗内存的压力而对于海量数据的情况我们可以考虑使用bloom filter它的操作方式是这样的使用 k 个 hash 函数来对集合中的 url 映射成位数组中的 k 个点然后把他们置 1 下次查询的时候只要通过 hash 看看这个 url 的结果是不是都是 1如果都是 1这个 url 就可能存在如果有任何一个 0就说明这个 url 一定不存在懵逼了?我来画个图吧一开始是这样的假设我们集合有 n 个 url这里初始化了位数组都是0接着对集合中的 url 都进行 k 个 hash这里以 url4 为例可以看到hash 之后映射到 1当下次要判断新的 url 是否在集合中的时候就可以使用 hash 去查找只要发现有 0那么就说明这个 new_url 一定不存在于集合中这样的方式可以节省超多的空间提高了空间的利用率在 python 中早有实现了 bloomfilter 的库pybloom可以自己定义容量和容错率使用 add 方法如果元素存在就直接返回 True如果不存在就返回 False此外还可以使用动态容量的方式ok通过以上这些方法对于数据的去重相信你应该知道怎么做了那么我们下回见啦peace 扫一扫学习 Python 没烦恼ps:如果你想获取更多小帅b提供的私密非公开且纯净无广告的干货 vip 教程,可以了解一下:跟小帅b一起通往「Python高手之路」 在公众号「帅彬老仙」发送「帅书」领取我写的技术电子书,转载请注明出处: wistbean Prev python爬取 20w 表情包之后,从此你就成为了微信斗图届的高手 Next python爬虫30 | scrapy后续,把「糗事百科」的段子爬下来然后存到数据库中