电力生产是把各种一次能源,包括化石燃料(煤炭、石油、天然气)、可再生能源(水能、 风能、太阳能、潮汐能、地热能和生物质能等)以及核能转换成电能,并输送和分配到用户。一 直以来,电力工业都是世界各国发展经济战略的重中之重,作为一项基础能源产业,它的发展关 系到国计民生的发展,是国民经济发展中最重要的一部分[1,2]。然而,近几年,电力行业安全事 故发生量还是处于上升状态,即使短短几秒钟的一次大停电事故,它所带来的影响也不亚于一场 大地震带来的破坏性[3,4]。 因此,采取有效的手段来获取并管理电力安全事故信息,仔细分析所 有的电力事故发生的原因,充分地发掘事故信息数据的内在价值,为安全事故的预防工作提供参 考信息,改善工作中存在的漏洞,才能避免大型事故的再次发生。 互联网的快速发展,使得我们可以应用互联网便捷、高效的获取所需的各种信息。但是, 互联网上的网络数据量以惊人的速度呈几何级的增长[5],利用人工获取费时费力,而网络爬虫技 术[6,7]则成为快速获取电力事故信息的一种全新的方式。通过利用 WebMagic 增量爬取技术,实 现了自动爬取电力安全管理网站中的电力事故信息,并将爬取所获得的结果存储到数据库中。 1 关键技术介绍 1.1 WebMgic WebMagic 是应用 Java 语言实现的 Web 爬虫,它参考了 Scrapy 的设计原理,Scrapy 是一种 使用 Python 语言开发,用于快速、高层次的屏幕抓取和 web 站点抓取,同时能够从抓取的页面 中提取出结构化数据的框架[8],通过使用最成熟的一些 java 世界的工具,如 HttpClient、Jsoup 等完成具体的实现。 WebMagic 是由 Downloader、PageProcessor、Scheduler、Pipeline 四个组件构成的[9],其中 Downloader 完成从互联网上下载页面的功能;PageProcessor 主要进行的工作是对所要下载的页 面进行解析,从中抽取出有用的信息,同时发现一些相关的新的链接;Scheduler 负责管理所有 待抓取的 URL,并完成去重的功能;而处理抽取的结果,包括对结果进行计算、将结果持久化 到文件或数据库等操作由 Pipeline 组件完成,WebMagic 逻辑的核心组件是 Spider,Spider 可以 被看做一个大容器,它将其余四个组件管理起来,实现组件之间的相互交互,以及流程化的执行。 如图 1 所示为 WebMagic 总体架构图。 ![]() 如上图所示 ,Request 既实现了 PageProcessor 与 Downloader 之间的交互 ,又实现了PageProcessor 对 Downloader 控制。Request 通过对 URL 地址的进行封装,保证一个 Request 请 求对应一个 URL 地址。 通过 Downloader 组件下载得到的一个页面,该页面可能是不同格式的文件,如包括 HTML 格式、 JSON 格式或其他文本格式等,Page 则用来表示内容,提供抽取信息和保存结果等功能, 因此,Page 是实现 WebMagic 抽取功能的核心对象。 PageProcessor 处理所得到的结果交给 ResultItems 对象保存,Pipeline 组件需要使用这些结果 时,由 ResultItems 对象提交给它使用。 1.2 Maven Maven 是一种专业的工具,用于构建和管理 Java 相关项目[10],应用 Maven 管理的 Java 项 目都有着相同的项目结构,即:采用统一的标准管理 java 的目录结构,src/main/java 目录下存 放所有的 java 代码,而 src/test/java 目录下存放所有的测试代码,同时,Maven 统一维护所有的 jar 包[11],所有需要的 jar 包都被放在一个本地“仓库”里,当某个项目需要用到某一个 jar 包的 时候,只需给出当前所需 jar 包的名称和版本号,以此实现 jar 包的共享;当本地“仓库”里找 不到所需 jar 包时,根据所提供的名称和版本号,Maven 会自动从远程仓库中下载这个 jar 包, 所有的配置只需在 pom.xml 的配置文件中完成。(www.zhimeng.org) 2 案例实现 本文采用 WebMagic 爬虫技术,以电力安全管理网(http://www./NewsSpecial /Electric/)为例,获取当前网站中的全部电力事故相关的新闻,包括当前页面的 URL 地址,新闻 的标题,以及新闻的内容,并将爬取所得的结果存储进数据库中。实验具体的操作流程图如图 2 所示。 ![]() 2.1 WebMagic 爬虫准备工作 为了应用 WebMagic 进行爬虫操作,首先需要借助 Maven 进行依赖管理,因此在项目的 pom.xml 配置文件中添加对象的依赖即可,如下所示: <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency> 2.2 网页信息爬取流程 2.2.1 列表页面及文章页面的 URL 确定 电力安全管理网站是以列表页分页的形式显示电力事故信息的,因此,需要通过遍历这些 分页找到所有的目标页面。 通过分析页面 URL,列表页的格式是“http://www./NewsSpecial/Electric/List_1. shtml”,其中 List_1 中的“1”是可变的页数。为了动态获取当前网站总的分页数,进行了如下 操作:首先,经过分析,当前页面在最下面的分页导航条中,除了提供点击进行跳转到首页,当 前页的上一页,当前页的下一页和尾页的功能以外,同时显示当前网站总的数据量和每页可以显 示多少条数据的信息的功能,因此,通过使用 HttpURLConnection 类,将当前的页面下载下来, 下载的结果即为当前页面的 HTML 编码,将该结果存储到字节流当中,利用正则表达式,匹配 出分页导航条中显示的当前网站总的数据量和每页显示多少条数据的信息,并将匹配结果从字节 流当中取出,利用这两个数据进行如下判断: 假设 m 表示当前网站总的数据量,n 表示每页可以显示数据的条数,p 表示当前网站的总 页数,则 m % n ≠ 0,则 p = m / n + 1;反之,m % n = 0,p = m / n,(其中,%表示求余运算, / 表示除运算)。 以此,可以获取到当前网站的总页数,以总页数为循环条件,依次放入“http://www.safehoo .com/NewsSpecial/Electric/List_*.shtml”这个 URL 地址中 List_*中的“*”的位置中,即为列表页 的 URL。 而 文 章 页 的 格 式 为 http://www./News/News/China/201103/173316.shtml , 其 中 “201103/173316”是可变的字符串。 2.2.2 定义实体类,封装爬取内容,并解析 HTML 当确定了列表页和文章页的 URL 地址,接下来要先实现对要爬取的内容进行确定,解析当 前的网页的 HTML,获取所需的信息,如图 3 所示,为打开浏览器的开发者工具后,当前网站 的 HTML 结构。 ![]() 其中新闻标题存在于 div 的 class 属性为 c_title_text 的标签 h1 下,通过 XPath 选择语句 //div[@class='c_title_text']/h1/text(),即可获得当前的新闻标题。同理,可以分析出新闻内容的选 择语句为//div[@class='c_content_text']/p/text()。新闻的 URL 利用正则表达式[12]获取,选择语句为 http://www./News/News/China/\\d+/\\w*\\.shtml。 WebMagic 可以使用注解的方式将抽取规则作用到某个指定的字段上,以此来表示依据这个 抽取规则抽取的结果,均保存到这个字段中。WebMagic 中提供了两个注解,分别是@ExtractBy 注解和@ExtractByUrl 注解。可以使用 CSS 选择器、正则表达式、XPath 和 JsonPath 等方式定义 注解表示的规则,需要注意的是,@ExtractByUrl 注解除正则表达式定义的规则以外,其它方式 均不支持。 利用这两个注解,当前所要爬取的信息实体类定义如下图 4 所示: ![]() 其中@TargetUrl 注解表示最终要抓取的 URL,也就是 2.2.1 节分析所得的文章页 URL,最终想要的数 据都来自与注解中第一的规则匹配的信息,即:http://www./News/News/China/\\d+/\\w+. shtml;而@HelpUrl 则是为了帮助找到最终 URL,过程中需要访问的页面,也就是 2.2.1 节分析所得的列表 页 URL,即为匹配这个规则(http://www./News/News/China/**)的所有页面。 2.2.3 定制 PageProcessor 爬虫信息的配置、页面元素的抽取规则的制定以及新链接的发现是定制 PageProcessor 过程中的三个 主要部分。 其中包括对于编码信息、每次抓取间隔的时间、超时时间、重试次数等信息的配置,以及一些模拟的 参数,比如 User Agent、cookie,以及代理的设置,是爬虫信息配置阶段需要完成的功能。本次实验中, 设置重试次数为 2,超时时间为 1000 秒,开启了 2 个线程。如下表 1 所示,为爬虫配置信息相关的方法。 ![]() 页面元素的抽取,WebMagic 中主要提供了 XPath、正则表达式和 CSS 选择器三种抽取方式。实验中, 关于新闻标题和新闻内容的抽取,选择了 XPath 的抽取方式[13];而当前新闻页面的 URL 的抽取,选择了正 则表达式的方式[14],之所以选择不同的抽取方式,因为不同的信息抽取基于不同的注解。 新链接的发现,是指当前我们所要爬取的一个站点的页面有很多,我们不可能在开始的时候将全部页 面列举出来,因此需要爬虫实现自动发现后续相关链接的功能,如下代码,为本实验中后续代码发现的部 分操作。 page.addTargetRequests(page.getHtml().links().regex("http://www./News/News/C hina/\\d+/\\w*\\.shtml").all()); 其中,page.getHtml().links().regex("http://www./News/News/China/\\d+/\\w* \\.shtml").all()用于获取所有满足“( http://www./News/News/China/\\d+/\\w*\\.shtml )”这个正则表达式的链接,而将所有满足条件的链接加入到待抓取的队列中去,以此来实现发现后续新的 链接的功能由 page.addTargetRequests()方法完成。 2.2.4 编写 Pipeline,将爬取到的数据保存到数据库。 Pipeline,是 WebMagic 用于保存抽取结果的组件,其实质是将 PageProcessor 组件抽取得到的结果, 继续进行后续处理。而之所以采用了两个组件的进行数据处理,是基于以下两个原因的:第一,实现模块 分离,第一,实现模块分离,分别将爬虫的两个阶段“页面信息的抽取”和“数据的持久化”交由两个不 同的组件完成,既可以保证代码结构清楚,又可以实现处理过程分开进行,完成在独立的线程甚至于不同 的机器上执行处理过程的功能;第二,由于 Pipeline 组件实现功能相对固定,保存结果到控制台或者数据 库中,这些操作对于所有的页面都是一样的,因此更容易做成通用组件,而页面的抽取方式变化很多,页 面的结构也不尽相同,因此抽取规则需要根据每个网页特别定制,不易做成通用组件。 本实验中实现了将结果输出到控制台并保存到数据库中。应用 MySQL 数据库保存抽取的结果,数据持 久化层框架[15]采用 JPA(Java Persistence API,),具体实现过程为,首先,业务逻辑层需要实现 PageModelPipeline 接口,然后将接口中的抽象方法 process(ResultItems resultItems, Task task)重写, 其 中 , 方 法 中 的 参 数 ResultItems 类 用 来 保 存 抽 取 结 果 , 它 本 身 是 键 值 对 的 结 构 , 可 以 通 过 ResultItems.get(key)获取在 page.putField(key,value)中保存的数据。该方法中添加输出到控制台的语 句,并且调用数据持久化层保存数据进数据库的方法即可。如下图 5 所示,为保存到数据库中的结果。 ![]() 3 结束语 通过对 WebMagic 爬虫技术的研究,应用 Maven 技术管理 java 项目,实现了对电力安全管理网站上电 力事故信息的爬取和存储。在实验过程中,通过对网页结构的分析,分别对所要爬取的字段采用 XPath 和 正则表达式的方式指定抽取规则,定制 PageProcessor 组件,实现信息的顺利爬取,同时,应用 Pipeline 组件,实现爬取数据存储入库,应用该模式,可以实现对其他相关电力网站事故信息的爬取,通过整理分 析历年事故信息,对每次事故发生原因高度重视,采取必要的措施加以解决和管理,避免大型事故的重复 发生。只有遏制住电力生产安全事故的发生,才能创造出更好的经济效益。 参考文献 [1]刘保国,林方. 贯彻科学发展观与促进电力产业发展[J]. 工会论坛(山东省工会管理干部学院学 报),2012,18(06):88-90. [2]何国才. 新形势下电力安全生产管理思考与探索[J]. 企业技术开发,2017,36(02):137-139. [3]李会俊. 关于电力安全监察工作问题探析[J]. 民营科技, 2014 (11):117-117. [4]Batra,Ioannides. Electric Accidents in the Production, Transmission, and Distribution of Electric Energy: A Review of the Literature[J]. International Journal of Occupational Safety and Ergonomics, 2001,7(3):285-307. [5] 赵本本,殷旭东,王伟.基于 Scrapy 的 GitHub 数据爬虫[J].电子技术与软件工程,2016(06):199-202. [6] 于娟,刘强. 主题网络爬虫研究综述[J]. 计算机工程与科学,2015,37(02):231-237. [7] Dusan Stevanovic, Aijun An ,Natalija Vlajic. Feature evaluation for web crawler detection with data mining techniques[J]. Expert Systems With Applications, 2012, 39(10) :8707-8717. [8] 李代祎,谢丽艳,钱慎一,吴怀广. 基于 Scrapy 的分布式爬虫系统的设计与实现[J]. 湖北民族学院学 报(自然科学版),2017,35(03).317-322. [9] 武婷婷. 一种基于 WebMagic 和 Mahout 的信息搜集与推荐系统[J]. 软件导刊, 2016, 15(10): 1-3. [10]杨新艳,于伟涛. 基于 Maven 的轻量级 Java 软件开发研究[J]. 科技传播,2015,7(17):134-135. [11]董晓光,喻涛. 使用 Maven 构建 java 项目[J]. 电子技术与软件工程,2014(10):105-105. [12]胡军伟,秦奕青,张伟. 正则表达式在 Web 信息抽取中的应用[J]. 北京信息科技大学学报(自然科学 版),2011,26(06):86-89. [13]阮娟. 基于 XPath 的新闻信息抽取系统设计与实现[J]. 智能计算机与应用,2015,5(02):58-61. [14]Djamal Belazzougui,Mathieu Raffinot. Approximate regular matching with multi-strings[J]. Journal of Discrete Algorithms, 2013,18(18):14-21. [15]李华勇. 计算机数据库存储技术的开发与应用[J]. 长沙铁道学院学报(社会科学版),2013,14(02): |
|
来自: 昵称62604924 > 《待分类》