基于Selenium的网络爬虫的设计与实现
2021-11-02忽爱平范伊红
忽爱平,范伊红,李 阳,李 坤
(河南科技大学 软件学院,河南 洛阳 471000)
0 引言
随着爬虫技术的不断发展,许多网站运用了反爬虫技术对数据进行加密,致使爬取数据时遇到的问题越来越多。例如,某著名文档网站,经过解析后发现,其文档是由图片组成,而图片代码并不是直接写在平时开发人员使用的标签中,而是通过HTML5的canvas元素使用JavaScript在网页上绘制图像[1]。这大大阻碍了图片的爬取。本文运用Python爬虫技术加Selenium技术爬取该网站的文档图片,将canvas画布中的图像进行解析,成功将该网站中的文档图片爬取了出来。
1 项目有关介绍
1.1 Selenium技术简介
Selenium是一个Web应用程序测试的工具,起初是为了网站自动化测试而开发的,作用是模拟用户在浏览器上的操作。Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,包括PhantomJS这些无界面的浏览器,可谓作用之广泛。Selenium可以根据用户的指令,指导浏览器自动加载页面,获取需要的数据,甚至于网页截屏、监听网站动作等等。Selenium自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。
1.2
HTML5中的新标签
2 案例实现
本文以某文档网站为案例,用自动化测试Selenium体验一下爬取流程。
2.1 抓包分析,明确爬取思路
首先,打开某文档网站的页面进行抓包分析。其次,通过分析发现,页面中的数据带有加密混淆,所以传统的爬虫思路在此站点行不通。遇到这种情况,一般有两种解决方案:第一种是通过使用JavaScript逆向技术找到站点的加密逻辑,并用Python代码将其加密逻辑模拟构造出来。第二种是通过Selenium自动化测试工具来模拟浏览器,直接获取页面源码。此处采用的是第二种方案。当获取源码之后,就会发现页面源码中并没有想要的图片链接信息,而想要的图片信息就蕴藏在
2.2 程序的基本配置
使用logging对日志输出进行相关配置,方便观察程序的执行状况。变量TIME_OUT表示超时时间,options中是对浏览器的相关配置,例如:下载图片是默认不显示弹框,图片下载后的默认保存路径,设置浏览器的无头模式等;browser用来接收一个Chrome对象,并将options作为参数设置给该浏览器对象。浏览器打开页面后,页面要进行加载,wait定义了浏览器的显示等待时间。代码如下:
2.3 页面加载
通过观察发现,每个文档页面并不是一开始就全部加载出来,而是通过用户滚动右侧的滚动条来加载后续的页面信息。所以图片进行下载之前要用Selenium来模拟用户的滚动效果,以确保将页面的所有信息都加载出来。此处,可以使用JavaScript代码来控制浏览器的滑动操作,这段代码描述的含义是通过js中的间隔器,每隔一秒将滚动条下滑整个文档高度的10%,直至页面全部加载完毕。最后,使用browser对象的execute_script方法将JavaScript代码执行即可。代码如下:
2.4 图片下载
当页面全部加载完毕,就可以开始下载响应的文档图片信息了。首先,需要获取到所有的canvas元素对象。在HTML5标准中,标签的新属性download可以用来指明下载文件的名称。所以每处理一个canvas对象都需要创建一个元素,将图片名称赋值给的download属性,使用URL.createObjectURL(Objparam)方法将canvas中的内容生成为指定格式的URL并将其赋值给的href属性。最后,调用click()方法可模拟点击操作,这样浏览器自动下载所有的图片[2]。部分代码如下:
2.5 文档格式的转换
图片下载过后,要将其进行PDF格式转换,最终生成一篇格式完整的文档。这里使用的第三方库是fpdf和PIL。将所有的图片处理程序定义成一个方法,在图片下载完成后进行调用即可。
3 结语
随着互联网的飞速发展,越来越多的网站通过对数据加密来防止数据被非法用户直接爬取。而通过Selenium技术则可以在避免过多检测的情况下向服务器发起正常请求获取数据,节省了大量分析代码的时间[3]。本文以某文档网站为例,设计了一段爬取