爬取的过程
爬取网站前首先要对其网站的url结构进行分析,遇到已经爬取过的网址会将其加入已经爬取的列表中,避免重复爬取。
Scrapy是基于第归算法实现的深度优先算法爬取数据
eg
def level_queue(root):
if root is None:
return
my_queue.append(node)
while my_queue:
node = my_queue.pop(0)
print (node.elem)
if node.lchild is not None:
my_queue.append(node.lchild)
if node.rchlid is not None:
my_queue.append(node.rchild)
爬虫去重策略
- 将访问url保存到数据库中——每次遍历浪费时间
- 将访问的url保存到内存set中——需要牺牲大量的内容
如果网页的url有个,每个大约50个字符的话大概占用1000000002btye50/1024/1024 = 9g内存
- 通过md5的哈希算法,压缩url的字符数,降低内存占用(scrapy采用的类似这种的方式)
- 采用bitmap方法,通过将url通过hash函数影射到某一位——会有可能发生冲突,一个连接映射为同一个位
- 使用bloomfiter方法对bitmap进行改进,多重hash函数降低冲突
如果采取bitmap的方法,1亿的url也就大约12mb的内存占用