基于Selenium自动化图像数据的采集
2023-07-20冯成刘昉
冯成 刘昉
摘要:随着计算机技术的发展,图像数据被广泛地应用在各种领域。因此,图像数据越来越受到人们重视。文章通过分析传统网络爬虫技术采集和数据存储,指出其受到各种因素限制,导致采集图像数据的效率低下,代码设计编写工作复杂,且容易造成存储资源的浪费。为了进一步提高网络爬虫效率,简化图像采集的实现过程以及节约磁盘的存储空间。文章以汽车之家为案例,使用一种基于Selenium+WebDriver方式完成对汽车图像数据自动化采集,并通过OpenCV算法将汽车图像数据进行大比例压缩,较大地节约磁盘的存储空间。
关键词:图像数据;自动采集;存储;压缩
中图分类号:TN919.1
文献标志码:A
0 引言
随着社会经济的快速发展,汽车已经进入千家万户。在互联网中的各类主题网站中存在海量的各类汽车图像,这些汽车图像广受人们的喜爱。受制于技术,大多数普通用户无法使用自动化的方式下载自己喜欢的图像。因此,为了解决这一问题,本文采用Selenium+WebDriver自动化方式采集汽车之家的图像数据,使用网络爬虫库Xpath完成数据的解析以及采集之后汽车图像命名,并用OpenCV技术将汽车图像数据下载和压缩至本地。
1 相关技术的介绍
近年来,随着互联网技术的快速发展[1],互联网技术在丰富网站页面元素同时,也促进了网络爬虫技术快速的提升。网站页面逐渐由单一式的静态网页界面逐步发展为页面元素丰富的动态交互式网页。网络爬虫中数据抓取的方式也由支持静态网页抓取的urllib、urllib3、requests库,发展到支持数据动态获取Selenium库和大型项目scrapy框架。
requests是数据请求库,用户使用requests库支持的get或者post方法发送对静态网页的请求,其中get方法主要应用于普通网址的请求,post方法主要应用于携带表单数据的请求,通过上述两种方法,能够获取请求网页的源代码。
Xpath(XML Path Language)是一款常用的数据解析库,用户可以根据页面元素位置,描述页面路径表达式。用户可以使用xpath()方法提取相应的数据。
Selenium是一个广泛应用于软件测试领域的工具[2]。Selenium库具有开源性,而被应用在Python网络爬虫上。其本质上模拟人操作指定的浏览器,并实现在浏览器页面上按钮点击、页面元素的定位、页面的选择、键盘的输入等操作,实现浏览即可完成数据的抓取。
Selenium支持多款常用浏览器。在本文中,Selenium可以结合ChromeDriver使用。用户安装ChromeDriver根据Google Chrome当前的版本号,选择相应的ChromeDriver版本,并在系统环境变量中配置Path路径即可使用。
图像压缩一直是图形图像领域中比较热门的研究方向,主要的图像压缩工作可以选择在“变换”“量化”“编码”过程中完成。压缩分类又可分为有损压缩和无损压缩,有损压缩是具有高压缩比且允许图像失真的一种压缩方法,广泛应用于图形图像、视频、音频数据的压缩等方面。
OpenCV是一款開源且支持多种编程语言的跨平台计算机视觉和机器学习库[3]。OpenCV-Python为OpenCV的接口,它提供了全面丰富且易用的图形图像处理函数,因此被广泛地应用在图形图像领域。
2 图像数据的抓取
基于Selenium+WebDriver汽车之家自动化爬取汽车图像数据,大致的流程如下:
(1) 第三方库的安装。
(2) 发送主页网址请求,输入搜索关键字完成关键字的搜索,实现网页的跳转和网页页面的切换操作。
(3) 针对多页汽车图像网页,实现汽车图像网页的分页跳转操作。
(4) 针对汽车图像数据对图像进行下载。
(5) 针对下载后的图像进行压缩和存储。
2.1 第三方库的安装
本文是在PyCharm环境下完成项目的开发,在程序编写前需要使用pip命令行的方式安装requests、lxml库和Selenium库、OpenCV-Python库,具体安装方式如表1所示。
2.2 数据请求
2.2.1 请求配置
通过谷歌浏览器访问“汽车之家”首页并复制其网址。在py文件中从Selenium模块中导入WebDriver库,关键代码为:“from Selenium import WebDriver”,为了方便针对爬取页面的数据定位和分析,需要将浏览器设置成为不自动关闭的状态,其关键代码如下:opt.add_experimental_option(‘detach,True),同时使用 opt.page_load_strategy = ‘eager配置内容,下载html内容,解决了自动化采集数据缓慢的问题,较大地改善网页爬虫速度。使用WebDriver.Chrome(opt)方法,opt为配置内容,生成Chrome对象。利用该对象使用get方法发送针对“汽车之家”的请求,其关键代码如: driver.get(url=‘https://www.autohome.com.cn/qiandongnan/)。由于首次访问主页,网站自动弹出广告,需要使用time.sleep(nums)方法暂停程序执行,nums为秒数,等待广告自动结束弹框自动消失,能够有效地解决弹窗广告导致的网站页面不一致的问题。
2.2.2 数据的发送和详情页进入
获取Selenium对象后,需要选择合适的方式定位搜索框。目前,Selenium库支持的find_element含有XPATH,ID,NAME,CLASS_NAME,LINK_TEXT,PARTIAL_LINK_TEXT,TAG_NAME等多种定位页面元素方式。本文根据分析首页页面元素情况,选择使用ID和CLASS_NAME定位搜索框和搜索按钮,并使用send_keys(“搜索关键词”)方法实现搜索框数据的填充,通过调用click()方法模拟鼠标的点击,其核心代码如下:
driver.find_element(by=By.ID,value=q).send_keys("关键词")
driver.find_element(by=By.CLASS_NAME,value=‘btn-search).click()
等待页面跳转完成之后,需要将程序切换至新的网页页面中,使用WebDriver提供switch_to.window(driver.window_handles[-1])方法完成最后页面的切换,同时需要程序多次使用定位、点击、页面切换等方法进入至汽车详情页。
3 分页跳转
由于汽车图像数据存在多个页面之中,因此需要采用分页的方式完成数据的采集。本文利用Python循环的方法,完成汽车图像数据的翻页操作。本研究定义了“死循环”,当使用link_text方法定位到“下一页”,利用get_attribute(“class”)方法获取属性值,与其属性值进行比较。如果不满足选择判断条件,则对“下一页”进行点击,并切换到最后一个页面并使用driver.current_url方法获取当前页面的url地址,将url地址转发至数据下载模块中。否则,若判断的是最后一页,则采用break的方法结束循环。其核心代码如下:
……
while True:#若当前页面不是最后一页,则完成程序的跳转。
if driver.find_element(by=By.LINK_TEXT,value=‘下一页).get_attribute(‘class)!=‘page-item-next page-disabled:
driver.find_element(by=By.LINK_TEXT,value=‘下一页).click()
driver.switch_to.window(driver.window_handles[-1])
d_url=driver.current_url
download(d_url)
else: #若当前页面是最后一页,则停止程序
break
…………
4 图像数据下载
在图像下载模块中,获取download(d_url)参数传递过来的每一页汽车图像网址之后,对该网址数据使用requests.get(url=d_url,headers=headers)发送请求,url为请求网址参数,headers为包含着键值对的字典类型请求标头数据,主要应对网站的爬虫措施。等待服务器页面响应。观察和分析响应网页页面元素发现,多张汽车图像数据都在同一个ul标签下,通过xpath完成数据的解析,获取含有所有汽车图像的ul标签内容。其核心代码如下:pic_list = html.xpath(‘/html/body/div[2]/div/div[2]/div[7]/div/div[2]/div[2]/ul),通过使用循环xpath返回的列表内容,获取当前标签下的每一个li标签的src汽车图像具体网址的属性值。
for pic in pic_list:#./表示当前目录,@src表示获取src属性的值
pic_url = pic.xpath(‘./li/a/img/@src)
再次循环pic_url提取每一个汽车图像的具体网络地址,将提取到的网址进行拼接。url_new = ‘https: + pic_url_a。针对拼接后的网址,再次发送requests请求,其代码如下:response=request.get(url=url_new,headers=headers),等待页面数据的响应之后,获取汽车图像二进制数据,并使用with open(pic_url_name,‘wb)as f的方法完成數据的写入,Pic_url_name为汽车名称,汽车名称截取于图像数据的链接地址最后一个索引所对应的数据,保持汽车名称数据的唯一性。pic_url_name = pic_url_a.split(‘__)[-1]。‘wb为二进制方式写入数据。将汽车图像数据写入文件。f.writer(response.content)。
5 图像数据压缩
面对大量图像数据的存储,往往受限于单机存储空间的容量。为了节约存储空间,本研究使用OpenCV库完成图像压缩。
首先,自定义图片压缩方法:
picture_compress(i_file,o_file,target_size,quality,step,pic_type)
其中,i_file:文件的输入路径。
o_file:文件的输出路径。
Target_size:输出文件的大小,设置该值为60。
Quality:初始压缩比,数值越高,图片的质量越好,设置该值为80。
Step:调整压缩比,设置该值为10。
pic_type:图片的格式,设置该值为jpg。
其次,通过read()方法,读取图像字节数据,并将数据放入buffer中,等待cv对象从内存缓存中读取任何颜色格式图像数据。img_cv2=cv2.imdecode(bufferdata,cv2.ImREAD_ANYCOLOR)。
使用循環方式判断当前图像容量是否大于设定的目标值,如果当前图像容量大于目标容量,则继续按照jpg图片格式编码,并设置图像初始压缩比quality,进行图像数据的压缩。cv2.imencode(‘.jpg,img_cv2,[int(cv2,IMWRITER_JPEG_QUALITY),quality])[1]。
最后,使用with open(o_file,‘rb)方式写入数据,生成新的文件。通过完成上述步骤将源文件分辨率为480×360、容量为86.5 KB的图像,压缩成分辨率为480×360、容量为37.5 KB、压缩比约为56%的图像,图像效果较好。压缩前后对比如图1所示。
6 结语
本文主要采用自动化方式对汽车之家的指定汽车图像数据进行爬取,并利用OpenCV算法将下载图像压缩,并保存到本地,达到了预期效果,为“网络爬虫技术”课程的教学活动开展,积累了丰富的实践应用案例。
参考文献
[1]刘相平.大数据环境下Hadoop作业调度算法研究[D].成都:电子科技大学,2015.
[2]闫龙川,张冰,袁孝宇,等.电力信息系统业务自动测试验证系统设计与应用[J].电力信息与通信技术,2022(2):63-68.
[3]曹瀚仁,葛其运,王鑫.用于手车式中压断路器限位开关的视频检测控制系统软件设计与实现[J].现代电子技术,2022(24):86-91.
(编辑 王永超)
Based on automated image data acquisition by Selenium
Feng Cheng, Liu Fang
(Guizhou Electronic Information Vocational and Technical College, Kaili 556000, China)
Abstract: With the development of computer technology, image data is widely used in various fields, so image data is getting more and more attention. By analyzing the traditional web crawler technology collection and data storage, this paper points out that it is limited by various factors, leading to the low efficiency of image data collection, complex code design and writing work, and easy to cause the waste of storage resources. In order to further improve the efficiency of the web crawler, simplify the implementation process of image acquisition and save the disk storage space, this paper takes Autohome as an example, using a Selenium + WebDriver method to complete the automatic collection of automobile image data, and compress the car image data in a large proportion through OpenCV algorithm, so as to save the storage space of the disk.
Key words: image data; automatic collection; storage; compression