网页qq抓取什么原理(如何避免就是重复检查模块要做的事(组图))
优采云 发布时间: 2021-11-24 06:26网页qq抓取什么原理(如何避免就是重复检查模块要做的事(组图))
什么是网络爬虫
网络爬虫是一种用于抓取网络资源的程序工具。谷歌、百度等知名搜索引擎使用网络爬虫从全网采集网络资源,建立索引,用于搜索。
网络爬虫实现原理
互联网网页可以看成是一张超大的图片,每个网页都是一个节点,网页中其他网页的链接是边。那么全网网页的采集可以实现为:从某个网页开始,下载并处理该网页,解析里面的链接,将得到的URL加入到下载队列中。这个过程其实就是图的遍历过程,可以是深度优先遍历,也可以是广度优先遍历,这取决于下载队列的维护方式。简单地说,一个网络爬虫可以由以下部分组成:
下载模块
对于给定的 URL,下载网页。如果从头开始,工作量还是比较大的:①解析URL中的域名,通过DNS查询域名对应的IP;②与IP建立TCP连接;③发送HTTP请求;④接收并解析HTTP响应⑤保存网页资源。说白了就是给定一个URL,使用HTTP协议请求一个网页资源的过程。
下载队列
下载队列保存了从网页解析出来的用于获取网页资源的URL:每次从下载队列中取出一个URL,通过下载模块下载网页,解析网页中的URL并加入到下载队列中,使其可以继续进行网页抓取。如果使用FIFO来实现下载队列,那么web资源的遍历就是广度优先;如果使用LIFO来实现下载队列,那么Web资源的遍历是深度优先的。
再检查一遍
如果网页收录下载网页的 URL 怎么办?不得再次下载。如何避免是反复检查模块。您可以使用一个集合来记录遇到的所有 URL。下载模块每次获取到一个网页时,将其URL放入集合中;解析网页得到的URL,如果集合中已经存在,则不加入下载队列NS。当然,这只是最直接的实现方式。工程中为了处理大量的URL,一般使用布隆过滤器。
Python 实现示例
#!/usr/bin/env python
# -*- 编码=utf8 -*-
导入 re、urllib2、md5、urlparse
类爬虫(对象):
def __init__(self, *starts):
self.seen = set() # 获取网页的网址集合
self.queue = [] # 要下载的队列
self.URLMOD = pie('href="([^"]*)"') # 匹配URL的正则
# 将起点URL加入下载队列
开始在开始:
self.queue.append(start)
定义过程(自我,网址,资源):
# 定期解析网页中的URL
对于 self.URLMOD.findall(res) 中的 new_url:
如果 new_url.find('\n') == -1 并且 new_url 不在 self.seen 中:
# 如果URL不在获取的集合中,加入下载队列
self.queue.append(new_url)
# 在这里写个性化的网页处理逻辑:save to file? 写入数据库?
定义运行(自我):
而self.queue:
# 从下载队列中删除一个 URL
url = self.queue.pop()
尝试:
# 下载这个网页:使用Python的urllib2
res = urllib2.urlopen(url, timeout=10).read()
打印'获取 %s %s'% (url,'')
除了:
# 下载错误
打印'Err %s %s'% (url,'')
继续
# 为获取的集合添加URL
self.seen.add(url)
# 处理这个页面
self.process(网址,资源)
如果 __name__ =='__main__':
爬虫('#39;).run()