网页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()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线