网页内容抓取工具(网络爬虫通用爬虫技术框架系统框架系统系统)
优采云 发布时间: 2022-03-05 03:02网页内容抓取工具(网络爬虫通用爬虫技术框架系统框架系统系统)
网络爬虫通用爬虫技术框架
爬虫系统首先从互联网页面中精心挑选一些网页,将这些网页的链接地址作为*敏*感*词*URL,将这些*敏*感*词*放入待爬取的URL队列中。 URL通过DNS解析,链接地址转换为网站服务器对应的IP地址。然后把它和网页的相对路径名交给网页下载器,网页下载器负责下载页面。对于本地下载的页面,一方面存储在页库中,等待索引等后续处理;另一方面,将下载页面的 URL 放入爬取队列中。该队列记录了爬虫系统已经下载的网页。避免系统重复抓取的URL。对于刚刚下载的网页,提取其中收录的所有连接信息,并在下载的 URL 队列中进行检查。如果发现该链接没有被爬取,则将其放在待爬取的URL队列的末尾。与此 URL 对应的网页将在 fetch schedule 中下载。这样就形成了一个循环,直到待爬取的URL队列为空,这意味着爬虫系统已经爬完了所有可以爬取的网页,此时完成了一个完整的爬取过程。
以上是一般爬虫的整体流程。从宏观上看,动态爬取过程中的爬虫与互联网上所有网页的关系可以概括为以下五个部分:
已下载网页集合:爬虫从互联网下载到本地索引的网页集合。
过期网页集合:由于网页数量众多,爬虫完成一个完整的爬取回合需要较长时间。在爬取过程中,很多下载的网页可能已经更新,导致过期。原因是互联网上的网页处于一个不断动态变化的过程中,很容易产生本地网页内容与真实互联网的不一致。
待下载网页集合:待抓取的URL队列中的网页,这些网页即将被爬虫下载。
未知网页集合:某些网页无法被爬虫抓取,这些网页构成未知网页集合。问题是,这部分页面的比例很高。
从理解爬虫的角度来看,以上对互联网页面的划分有助于深入理解搜索引擎爬虫面临的主要任务和挑战。绝大多数爬虫系统都遵循上述流程,但并非所有爬虫系统都如此一致。根据具体的应用,爬虫系统在很多方面都有所不同。一般来说,爬虫系统可以分为以下三种。
批量爬虫:批量爬虫的爬取范围和目标比较明确。当爬虫到达这个设定的目标时,它会停止爬取过程。至于具体的目标,可能不一样,可能是设置爬取一定数量的网页,也可能是设置爬取时间等等,都不一样。
增量爬虫:与批量爬虫不同,增量爬虫会不断地不断爬取。抓取到的网页要定期更新,因为互联网网页是不断变化的,会不断增加新的网页和网页。删除或更改网页内容是很常见的,增量爬虫需要及时反映这种变化,所以在不断的爬取过程中,要么是爬取新的页面,要么是更新已有的页面。常见的商业搜索引擎爬虫基本属于这一类。
垂直爬虫:垂直爬虫专注于属于特定行业的特定主题或网页。比如health网站,你只需要从互联网页面中找到健康相关的页面内容即可。不考虑其他行业内容。垂直爬虫最大的特点和难点之一是如何识别网页内容是否属于指定行业或主题。从节省系统资源的角度来看,下载后不可能将所有的互联网页面都屏蔽掉,这样会造成资源的过度浪费。爬虫往往需要在爬取阶段动态识别某个URL是否与主题相关,尽量不使用。爬取不相关的页面以达到节省资源的目的。垂直搜索网站或垂直行业网站往往需要这种爬虫。
页面爬取策略深度优先策略
深度优化策略是一条路走黑,当一条路走不通时,再回去走另一条路。图为深度优先爬取策略*敏*感*词*。假设页面A是Spider的入口,Spider在页面A上找到了三个1、7、11页面的链接,然后Spider就会按照图中的数字进行操作。抓取按指示的顺序执行。当第一个路径抓取3个页面时结束,然后返回2个页面抓取第二个路径中的4个页面,并且还在4个页面中抓取头部,它会返回1个页面抓取第三个路径中的5个页面,并且一路抢,抢到头后,会按照之前的规则,一个接一个地抢。
广度优先战略
广度优先策略是指当Spider在一个页面上发现多个链接时,它并没有一路走到黑边继续沿着一条链爬行,而是先爬取这些页面,然后再从这些页面中爬取链接图为广度优先爬取策略*敏*感*词*。假设页面A是Spider的入口,Spider在页面A上找到了三个页面1、2、3,爬取了1个页面后,只把1个页面中4和5页面的链接放入URL要爬取的列表,不会爬取1页中的其他链接,而是2页。当b级页面爬取完成后,从b级页面提取到c级页面的4、5、6、7、8、@会是爬取>9 六页,爬取c级页面后,爬取从c页面中提取的新D级页面,依次继续爬取。
网页选择策略
网页选择策略也被称为“页面选择问题”,通常是尽可能先爬取重要的网页,以保证那些重要性高的网页得到尽可能多的关注。可能在有限的资源范围内。重要性度量由链接流行度、链接重要性和平均链接深度等方面确定。链接流行度定义为IB(P),主要取决于反向链接的数量和质量。首先,看数字。直观地说,一个网页指向它的链接越多(反向链接越多),就意味着其他网页可以识别它。同时,该网页被网民访问的几率较高,推测其重要性较高;其次,在检查质量时,如果被更重要的网站指向,那么它的重要性会更高。如果不考虑质量,就会出现局部最优问题,而不是全局最优问题。最典型的例子就是作弊网页。在一些网页中人为设置了大量的反制链接指向自己的网页,以增加网页的重要性。如果不考虑链接质量,就会被这些作弊者利用。
重温策略
重访策略是搜索引擎蜘蛛抓取网页后,根据页面的权重来确定,包括其更新频率、更新质量、外链数量等,然后对于高的页面权重,蜘蛛会在很短的时间间隔回来重新爬取,比如新浪网,它的权重很高,搜索引擎蜘蛛会在几秒钟内重新爬取。对于一些权重较低的页面,比如很长时间没有更新的页面,蜘蛛会在很长一段时间后抓取它们。比如我们经常搜索的百度大更新,蜘蛛会抓取一些低权重的页面。所有的爬取,总的来说,百度的大更新,一个月一次。
URL 重复数据删除将 URL 保存到数据库以进行重复数据删除
为了尽快搭建整个爬虫,最初的URL去重方案是直接使用数据库的唯一性约束去重。这是最省时的方法,大家可以想象并做到。
将URL放入HashSet去重
数据库中的去重,每次比较都有一个请求数据库的过程,对数据库的性能消耗很大。所以可以使用内存中HashSet的URL去重。 URL 的字符串放在 HashSet 中。首先在 HashSet 中搜索任何新的 URL。如果没有 HashSet,则将新 URL 插入 HashSet。并将 URL 放入待爬取队列中。这种方案的优点是其去重效果精确,不会漏掉一个重复的URL。它的缺点是随着数据的增加会出现Out Of Memory。假设单个 URL 的平均长度为 100 字节,那么 1 亿条数据占用 10G 内存,而计算机内存大部分为 4G 和 8G,因此留给 JVM 的内存更少,内存泄漏会更快发生或更高版本。
在MD5之后保存URL到HashSet
这里的处理方式是原创的URL不存储在HashSet中,而是将URL压缩后再放入。压缩的方法有很多,用MD5对URL进行编码是一种比较省时的方法。 MD5的结果是128位,长度为16字节。与估计的平均 URL 长度 100 字节相比,减少了 6 倍以上。一亿条数据占用1.6G内存。 Scrapy 使用类似的方法。当然,无论使用哪种压缩算法,随着 URL 越来越多,总有一天会出现 Out Of Memory。因此,该解决方案没有解决本质问题。 MD5 的另一个问题是,有可能将两个相同的 URL 映射到相同的 MD5 值,从而永远不会抓取其中一个。
使用Bitmap方法去重
使用Bitmap方法去重的原理是将URL映射到哈希后的bit的每一位。 1亿个URL占用约12M。主要缺点是去重不够准确,存在冲突。
布隆过滤器
Boolm Filter 是一个 m 位的位数组,该数组用 0 填充。同时,我们需要定义k个不同的散列函数,每个散列函数将每个输入元素随机映射到位数组中的一个位。然后对于某个输入,我们得到 k 个索引。
插入元素:经过k个哈希函数的映射,得到k个索引,我们将位数组中的所有k个位置设置为1(不管位是0还是1)
查询元素:输入元素经过k个哈希函数映射后,会得到k个索引。如果位数组中的k个索引中的任何一个为0,则表示该元素不在集合中;如果元素在集合中,则插入元素时 k 位全为 1。但是如果 k 个索引处的位都是 1,那么被查询的元素是否必须在集合中?答案不一定,就是说有 False Positive 的情况(但是 Bloom Filter 不会有 False Negative 的情况)
上图中,插入x、y、z这三个元素后,再查询w,会发现w不在集合中,如果w是通过三个hash函数计算出来的,则索引如果位都是 1,那么布隆过滤器会告诉你 w 在集合中。其实这是误报,w不在集合中。
反爬虫机制IP拦截
常见网站反爬虫首先考虑是否会对用户造成意外伤害。比如在校园网中,有一台机器不断的对网站产生频繁的请求,校园网涉及到的用户太多,但是如果IP被封了,就会对网络上的用户造成意外伤害。校园,流失大量用户。就拿一个像宝藏一样大的公司来说,它不会长时间封禁IP,也不会封杀,除非万不得已。
解决方案:
1.使用修改程序的访问频率
可以休息两秒如time.sleep(2)
2.使用IP代理爬取网站数据量
#导入requests库,如果使用其他自导入导入请求
代理 = { http::8888, https::1080,}
requests.get(url, proxies=proxies)
协议头
绝大多数网站在访问的时候都会判断来源,比如手机用户和电脑用户也访问QQ空间,但是页面不一样,这是为什么呢?,在写爬虫网站还要判断它的出处,爬虫初学者初学者会写这样的代码
一个栗子
rs= requests.get('')print(rs.text)
我相信这个代码已经被很多初学者使用过。百度,一个搜索引擎网站页面,不管是爬虫还是其他人访问,又是一个栗子
rs=requests.get('')
返回状态为response404
这是为什么,简书无法确定用户访问的来源,所以会返回404错误提示你是爬虫,访问被拒绝。
如何解决?
解决方案
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome /55.0.2883.87 Safari/537.36}
rs=requests.get('')
返回状态为response200
至此我们可以愉快的参观一下了。
验证码
当用户请求频率过高时,部分网站会触发验证码验证机制,让你输入各种验证码。网站的票务查询请求,在购票时会显示验证码,然后12306会判断你是否是机器人,
解决方案
加入编码平台
需要登录才能获取信息
例如知乎、FaceBook ...等网站要求用户登录后才能获取页面上的信息,所以这种保护可以非常有效的防止数据泄露以免被大量抓取。
解决方案:
1.数据量小(模拟登录然后爬取,或者直接使用cookies爬取)
2.申请多个账号支持这些账号,然后登录,或者获取cookies进行爬取。
js图片的反爬
例如,爬虫在爬取网站时,会从首页获取有效信息,但对于不需要的,爬虫不会访问,而是在真正的时候访问首页。用户通过浏览器访问服务器上的js和图片资源,那么服务器端会判断用户是否访问过这些资源来判断是否是爬虫。
解决方案
使用硒
Selenium 是一种用于 Web 应用程序测试的工具。 Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括IE(7, 8, 9, 10, 11), Mozilla Firefox, Safari, Google Chrome, Opera等。
WebCollector 爬虫框架
WebCollector是Java爬虫框架(内核),无需配置,方便二次开发。它提供了一个精简的 API,只需要少量的代码就可以实现一个强大的爬虫。 WebCollector-Hadoop 是 WebCollector 的 Hadoop 版本,支持分布式爬取。