1、实验概述
设计、实现图片网络爬虫,从网站上批量下载图片;并对图片进行图像处理。
2、实验环境
1)语言:网络爬虫:Python;图片处理:C++
2)软件环境:Visual Studio2015;Pycharm2017
3、实验设计思路
4、实验实现
A.全局变量及导入的库
B.网址获取
定义了一个MyCrawler类用于获得当前页面的链接网址,其中成员linkQuence用于存储已访问过的网址和即将访问的网址;成员bloomfilter类用于网页去重。
crawling函数用于抓取网页中的链接并将已访问过的网址加入已访问网址栈,当抓取深度超过自定义的需要爬取的深度即停止爬虫;当已访问过的不重复的网址超过1023或者未访问过的网址栈为空,即开始下一深度的爬取。将网址加入已访问网址栈时需要对其利用BloomFilter进行去重。爬取网址结束后打印出已访问网址栈的长度,即已访问的网址个数。
通过requests中的get函数得到网页url中的源码内容存储在data中;正则表达式r"(?<=href=“).+?(?=”)|(?<=href=‘).+?(?=’)"通过匹配从data中取出标签href中的内容;if判断筛选出有效超连接。
实现一个网址访问栈类。
C.网页去重
实现一个BloomFilter类。
根据公式以及要求假阳性概率在0.1%之内,且应有至少1000个不重复的网址,则取布隆过滤器的n = 1200, m = 15000, k = 7。
利用DEK哈希算法生成哈希值。
D.图片下载
利用request库中的urlopen方法打开一个url地址并用read方法读取url上的数据;正则表达式r’src=“([a-zA-Z0-9.😕]+?.jpg)”'用来获取url上的图片地址;再利用urlretrieve方法保存图片到本地。
E.图像处理
定义了一个PixImage类,private部分存有图片的尺寸、像素信息、处理后的图片信息以及图片处理方式对应的函数;public部分有相应的像素处理函数接口、中值滤波图片模糊处理接口、sobel算子处理接口以及图片显示、保存的函数。
利用.ptr<>函数访问并得到图片的像素信息。
对图像中的像素进行量化处理。如常见的RGB24图像有256256256中颜色,通过Reduce Color将每个通道的像素减少8倍至256/8=32种,则图像只有323232种颜色。假设量化减少的倍数是N,则代码实现时就是简单的value/N*N,通常会再加上N/2以得到相邻的N的倍数的中间值,最后图像被量化为(256/N)×(256/N)×(256/N)种颜色。