一个试图避免下载重复内容的组件
项目描述
MaybeDont 是一个库,它帮助在爬取过程中避免下载具有重复内容的页面。它在爬取过程中学习哪些URL组件是重要的,哪些是不重要的,并尝试根据它来预测页面是否会重复。
想法是,如果您有一个仅遵循所有链接的爬虫,它可能会下载很多重复的页面:例如,对于论坛,可能会有像 /view.php?topicId=10 和 /view.php?topicId=10&start=0 这样的页面 - 唯一的区别是添加了 start=0,而这些页面的内容可能是重复的。如果我们知道添加 start=0 并不会改变内容,那么如果我们已经抓取了 /view.php?topicId=10,那么我们就不会下载页面 /view.php?topicId=10&start=0,从而节省时间和带宽。
重复检测器
maybedont.DupePredictor 收集页面URL和内容的统计数据,并能预测新的URL是否会带来新的内容。
首先,初始化一个 DupePredictor
from maybedont import DupePredictor dp = DupePredictor( texts_sample=[page_1, page_2, page_3], jaccard_threshold=0.9) # default value
texts_sample 是一个页面内容的列表。它可以省略,但建议提供:它用于学习页面哪些部分是许多网站的页面中常见的,并排除这些部分,从而从重复比较中排除。这对于内容相对于网站外观(页脚、页眉等)较小的页面有帮助:如果不删除外观,所有这些页面都会被视为重复,因为只有极小的一部分内容发生变化。
接下来,我们可以使用下载的页面更新 DupePredictor 模型
dp.update_model(url_4, text_4) dp.update_model(url_5, text_5)
一段时间后,DupePredictor 将学习URL中哪些参数重要,哪些可以安全忽略。DupePredictor.get_dupe_prob 返回url是已看到的某些内容的重复的概率
dp.get_dupe_prob(url_6)
运行时开销不应太大:在一个包含小于100k页面的爬取中,更新模型的预期时间是1-5毫秒,获取概率的时间不到1毫秒。所有访问过的URL和内容哈希都存储在内存中,以及一些索引结构。
安装
pip install MaybeDont
爬虫中间件
如果您有一个 Scrapy 爬虫,或者正在寻找爬虫中间件的灵感,请查看 maybedont.scrapy_middleware.AvoidDupContentMiddleware。首先,它收集一个文档队列以更好地了解网站哪些页面元素是常见的,以便从内容比较中排除它们。之后,它建立自己的 DupePredictor,使用爬取的页面(只考虑文本页面)更新它,并在足够有信心后开始丢弃重复内容的请求。不是所有重复请求都会被丢弃:以很小的概率(目前为5%),请求仍然会被执行。这使得重复检测更能抵抗爬取过程中网站URL或内容结构的变化。
要启用中间件,需要以下设置
AVOID_DUP_CONTENT_ENABLED = True DOWNLOADER_MIDDLEWARES['maybedont.scrapy_middleware.AvoidDupContentMiddleware'] = 200
中间件仅应用于具有 avoid_dup_content 的请求 request.meta。
可选设置
AVOID_DUP_CONTENT_THRESHOLD = 0.98 - 跳过请求的最小概率。
AVOID_DUP_CONTENT_EXPLORATION = 0.05 - 应丢弃但仍然执行请求的概率
AVOID_DUP_CONTENT_INITIAL_QUEUE_LIMIT = 300 - 在初始化 DupePredictor 之前应下载的页面数
工作原理
重复检测基于 datasketch 库中的 MinHashLSH。使用文本4-shingles的单词进行哈希,不跨越提取文本中的换行符。
测试了关于重复的几个假设
具有给定URL路径的所有URL都相同(有相同的内容),无论查询参数如何;
仅在不同URL查询参数上有所不同的所有URL都相同(例如,可以通过这种方式检测会话令牌);
具有给定路径且仅在给定URL查询参数上有所不同的所有URL都相同;
具有给定路径和查询字符串且仅在单个给定查询参数上有所不同的所有URL都相同;
如果URL有相同的路径且仅在某些URL中添加了给定的param=value查询参数,则URL相同;
如果URL有给定的路径且仅在给定的param=value查询参数上有所不同,则URL相同;
为每个假设拟合伯努利分布。
许可证
许可证是MIT
项目详情
MaybeDont-0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1f7f95cb98f2342ceaf4b763ce0872385898a2c910a6eb6534493ff50c6e6fea |
|
MD5 | 516120657fce48b935f94fe4b45a8c36 |
|
BLAKE2b-256 | 63e602985110c53867f105bf208d84fd86769c96d6a4d5a310fd19cc4dc32a50 |