网页数据抓取怎么写(一个网络爬虫提取出该网页中的新一轮URL环路)
优采云 发布时间: 2022-04-03 22:14网页数据抓取怎么写(一个网络爬虫提取出该网页中的新一轮URL环路)
一般我们要爬取一个网站的所有URL,先传递起始URL,然后通过网络爬虫提取网页中所有的URL链接,然后对每一个提取的URL进行爬取,提取新一轮的URL在每个网页中,依此类推。总体感觉是网页中的链接是从上到下爬的。理论上,整个站点的所有链接都可以被爬取。但是问题来了,一个指向 网站 中网页的链接是循环的。
比如在网站首页,我们可以看到首页链接,那么我们也可能在子页面中看到指向首页的链接,在子子页面。首页。按照我们之前的逻辑,爬取每个页面中的所有链接,然后继续爬取所有链接。以首页为例,我们首先抓取的就是它,然后子页面中有指向首页的链接,子子页面有指向首页的链接. 如果进行这种爬取,会不会导致网页的重复爬取,而其他网页根本没有机会爬取。我无法想象。解决这个问题并不难。这时候,我们就需要用到网络爬虫中的一个重要知识点,那就是网页去重。
首先介绍一个简单的思路,这也是一个经常使用的通用思路。我们把爬取的网页放到一个列表中,以首页为例,当首页被爬取的时候,把首页放到列表中,然后在我们爬取子页面的时候,如果再遇到首页,并且主页已经被爬取。这时候可以跳过首页,继续爬取其他页面,避免重复爬取首页的情况。这样,爬取整个站点的时候就不会出现循环。路。以此思路为出发点,将访问过的URL保存在数据库中,当获取到下一个URL时,在数据库中检查该URL是否被访问过。虽然数据库有缓存,但是当在数据库中查询每个URL时,效率会迅速下降,
第二种方法是将访问过的 URL 保存在集合中。这种方式获取url的速度非常快,基本不需要查询。然而,这种方法有一个缺点。将 URL 保存到集合实际上是将其保存到内存中。当 URL 数据量很大(比如 1 亿)时,内存压力会增加。对于小型爬虫来说,这种方法是非常可取的,但对于大型网络爬虫来说,这种方法很难实现。
第三种方式是对字符进行md5编码,可以将字符缩减到固定长度。一般来说,md5编码的长度在128bit左右,也就是16byte左右。在不缩减之前,假设一个URL占用的内存大小为50字节,1字节等于2字节,也就是100字节。可以看出,经过md5编码后,节省了大量的内存空间。通过md5方法,可以将任意长度的URL压缩成相同长度的md5字符串,不会出现重复,达到去重的效果。这样在很大程度上节省了内存。scrapy框架采用的方法有点类似于md5的方法。因此,在正常情况下,即使 URL 的量级达到数亿,scrapy占用的内存小于set方法。少得多。
第四种方法是使用位图方法进一步压缩字符。这种方法是指在计算机中申请8位,即8位,每个位用0或1表示,是计算机中的最小单位。8个比特组成1个字节,如果一个比特代表一个URL,为什么一个比特可以确定一个URL?因为我们可以对 URL 执行哈希函数,然后将其映射到位。例如,假设我们有8个URL,分别对应8位,然后通过位上方的0和1的状态,我们可以指示该URL是否存在,这种方法可以进一步压缩内存。
但是bitmap方式有一个非常大的缺点,就是它的冲突会非常高,因为使用了同一个hash函数,很有可能将两个不同的URL或者多个不同的URL映射到一个位置。其实这个hash方法也是set方法的一种实现原理。它对 URL 进行函数计算,然后将其映射到位位置,因此这种方法非常压缩内存。简单计算,还是用1亿个URL来计算,相当于1亿比特。通过计算,相当于12500000字节。除以 1024 后大约是 12207KB,也就是大约 12MB 的空间。在实际过程中,内存占用可能会大于12MB,但即便如此,与前面三种方式相比,这种方式还是大大减少了内存占用。但同时,与这种方法发生冲突的可能性非常高,所以这种方法不是很适合。那么有没有什么办法可以进一步优化bitmap这种重内存压缩的方法,减少冲突的可能性呢?答案是肯定的,这是第五种方式。
第五种方式是bloomfilter,通过多个hash函数减少冲突的可能性来改进位图。这样,一方面可以通过位图的方式达到减少内存的效果,另一方面也可以减少冲突。关于bloomfilter的原理和实现,后面我一定会介绍给大家。今天,让大家有个简单的认识。Bloomfilter适用于大型网络爬虫,尤其是数量级超大时,bloomfilter方法可以事半功倍,并且经常配合分布式爬虫达到爬取的目的。
网页爬取过程中的五种去重策略方法的介绍就先到这里了。如果你不明白,你应该明白。普及后,问题不大。希望对小伙伴的学习有所帮助。
下午有小伙伴提到,以上5种方法只适用于单工艺条件。如果是多进程,则需要设置一个管道进行信息交换,也可以直接设置一个管道而不是设置。,谢谢知乎这位不愿露面的大佬~~
-----------------END--------------------------------
要进群,请在微信后台回复【学习】
在公众号后台回复以下关键词即可免费获取相应学习资料:
Python3、Python基础、Python进阶、网络爬虫、书籍、
自然语言处理、数据分析、机器学习、数据结构、
大数据、服务器、Spark、Redis、C++、C、
php、mysql、java、Android、其他