朱梓熙,吴文庆
(广东水利电力职业技术学院,广东广州 510635)
随着人口老龄化趋势的加快,社会养老、社会医疗、社会消费、劳动力结构和农村老龄问题等正面临前所未有的挑战,养老机构养老正在成为养老方式的一个重要选择之一,因此如何快速获取养老机构信息正是值得研究的问题。目前多数人选择养老机构往往优先考虑的是在网上进行相关养老机构信息的查阅,再到实地进行查看,然而,网上养老机构信息的杂乱使大家应接不暇,不知如何下手。本文从养老机构的数据自动采集、处理和可视化等角度具体介绍实现方法,让使用者免除其他信息和操作的干扰,直接看到最有价值的信息,以满足使用者的需求。
爬虫就是对网站请求并提取数据的自动化程序。其中,请求、提取和自动化是爬虫的关键。使用统一资源定位符(uniform resource locator,URL)地址封装必要的请求参数,以模拟浏览器请求访问 网页(WEB)服务器的方式,使用超文本传输协议(HTTP)获取网站服务器端的许可,返回原始页面并解析数据[1]。搜索引擎的网络爬虫抓取工具属于常见网络爬虫。本文主要通过Python1一种广泛使用的解释型、高级编程、通用型编程语言。编写爬虫代码,以获取养老网站的数据,然后对该数据进行处理展示。
1.2.1 爬虫步骤
在爬虫的过程中需要对目标网站(URL链接)及页面进行分析,以便决定要爬取的方式、内容和所需要的操作方式。例如对养老网进行养老机构信息采集,通过对该养老网的分析,可以发现主要的养老机构信息可在养老机构查询链接上进行采集。本文使用Python来模拟浏览器,通过对该链接的访问获取相关信息的文本,通过分析文本找到每个养老机构信息的独立链接,再通过依次访问每个养老机构的独立链接得到含有更详细内容的文本,以便我们进行下一步操作。
1.2.2 养老网信息爬取
通过Python中的requests库2requests库是常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。构建一个会话(session)[2],定义好用户代理(UA)头部后使用会话发起一个HTTP请求,也就是访问养老网的查询链接。部分代码如下:
在获取到文本时,通过Python中的eautifulSoup库来对该文本进行字段的截取与处理,获得各个养老机构详细信息的跳转链接;通过对该链接进行补全,进而继续访问详情链接,从而得到各个养老机构的详细信息文本;最后再通过BeautifulSoup库,根据相关需求来处理该文本,提取相关信息。通过这样不断地采集,就可以将该网站下的所有养老机构信息都提取出来。部分代码如下所示:
从网络上爬取的数据经常会出现空行、重复记录、缺失值、数据不完整、数据矛盾、异常值等情况,不仅会影响后期对数据的挖掘和分析,而且会影响建模,甚至会导致错误的建模结果,因此,数据清洗是尤为重要的[3]。数据清洗的主要任务就是消除这些干扰信息,保留有用信息,并为以后进一步数据分析提供有力的帮助。数据清洗主要是删除原始数据中的重复数据和异常值,过滤掉与建模无关的数据及平滑噪声数据等。对于本次爬取到的文本,本文采用了正则表达式和BeautifulSoup库来进行数据清洗。
在对养老机构进行爬虫的过程中,由于有部分信息需要用户进行登录才能显示,因此需要使用Python来进行登录信息的表单构建,再将构建好的表单使用session的post方法提交到登录页面上,从而实现自动登录。但由于养老网用户登录时需要填写验证码,所以需要先对验证码进行自动化识别。
目前许多网站采取了各种各样的反爬措施来针对机器化的自动采集,其中的一个措施就是采用验证码的方式来进行人与机器的操作的判断与隔离。目前,广泛使用的主要是以下几种形式的验证码:
(1)滑块验证码。在验证过程中需要将碎片直线移动到该图的缺口上。这种方式要自动化的话较为麻烦,可通过查看原图与有缺口的图片之间像素点的不同获取到该碎片所需要移动的距离,再通过selenium等库来模拟人的鼠标点击拖动等[4]。由于本次的目标网站没有进行此类的验证,故在此不多赘述。
(2)图文验证码。通过文字的方式提醒用户点击图中的文字;或是给出一组图片,要求用户点击其中某种类型的图片。该方式要进行自动化的话很麻烦,一般对这种验证方式都需要进行人为操作。
(3)图片验证码。通过提供一张图片,然后让用户输入图片中的字母、数字、汉字等来进行验证。本次的目标网站就是通过该方式来对用户进行验证。
2.2.1 光学字符识别
针对该网站的图片验证码,在此使用光学字符识别(OCR)技术来对图片验证码进行识别。OCR是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程[5]。
tesserocr是Python的一个OCR库,但其实是对tesseract做的一层Python API的封装,所以其核心是tesseract。tesserocr使用Cython直接与Tesseract的C++ API集成,允许使用简单的Pythonic和易于阅读的源代码。 通过在tesseract中处理图像时释放全局解释器锁(GIL),它可以在与Python的线程模块一起使用时实现真正地并发执行。因此,在使用tesserocr之前,我们需要先安装tesseract,之后就可以尝试着对验证图片进行识别了[6]。
2.2.2 灰度处理与二值化
在对图片进行识别前,一般需要对图片先进行处理,剔除掉多余的信息,如颜色或多余的背景线条等。本次在进行图片文字识别前先对图片进行了灰度处理和二值化,将图片变成黑白图片,以便于后面的文字识别。在Python中通过使用Image库来对获取到的验证码图片进行处理[7],具体代码如下所示:
通过调用该代码后处理的效果如图1所示。
图1 验证码图片识别处理的代码执行前后差别
2.2.3 图片识别
在对验证码图片进行处理后,就可以使用tesserocr库进行文本识别,通过执行tesserocr.image_to_text(image)代码返回识别后的字符串,如对图1处理后的图片识别效果为“femy”。获得识别出来的验证码后,将该验证码添加进之前构建的表单进行post传递,就可进行自动登录。
在对验证码图片的自动验证完成后,我们可以根据目前大部分网站的登录验证方式建立一个自动登录验证模块。先基于目前大部分网站的密码验证方式编写相关的验证码验证代码块(由于本文的目标网站采取的是图片验证方式,所以当前只实现了图片验证代码块),再通过人工或代码自动定位到登录页面的验证码文本,然后获取该文本下方的验证图片或图片弹出按钮,在执行之前编写好的验证代码块;若是不符,则自动执行其他的验证代码块[8]。具体算法描述如下:
(1)输入:登录页面网址。
(2)根据网址定位到验证码位置。
(3)根据验证码位置找到其兄弟节点,获取验证码图片或按钮。
(4)执行编写的验证代码块,若返回结果为空,则调用另外的验证代码块,如:
(5)根据输出内容判断是否成功。
在从相关网站获取到所需信息之后,在此将信息构建成一个html格式的列表放Tomcat进行可视化展示。
通用网关接口(common gateway interface,CGI)是一段运行在服务器上的程序,可提供同客户端 HTML 页面的接口。CGI是外部扩展应用程序与WWW服务器交互的一个标准接口,按照CGI标准编写的外部扩展应用程序可以处理客户端(一般是WWW浏览器)输入的协同工作数据,完成客户端与服务器的交互操作。CGI通信由两部分组成:一部分是用户的浏览器显示的页面,也就是HTML页面;另一部分则是运行在服务器上的CGI程序[9]。它们之间的通信方式如图2所示。通过CGI脚本使服务器的浏览器与用户能交互,也可以在浏览器中运行Python的代码。
图2 CGI通信方式示意
在浏览器中通过CGI 编程来运行Python脚本前,需要先在本地搭建一个web服务器。Python 3.X版本自带了一个CGI服务器,通过在命令行在新建目录下执行相关命令python -m http.server -cgi端口号来启动服务器,并将写好的Python脚本放在新建目录的子目录“cgi-bin”中,通过访问“http://localhost:端口号/cgi-bin/文件名.py”来执行该脚本,只需在该脚本上进行html文本打印,就可以进行页面展示[10]。
随着大数据和人工智能时代的到来,借助本文研究设计的方法,可以构建一个智选养老机构系统,为有需要的人士缩短查找养老机构的时间,快速找到符合自己需求的养老机构。