APP下载

基于Python的Web数据采集技术

2012-06-01李隐峰宋玉伟

电子科技 2012年11期
关键词:字符结构化报文

齐 鹏,李隐峰,宋玉伟

(西安电子科技大学电子工程学院,陕西西安 710126)

1 Web数据抓取技术介绍

1.1 Web数据抓取

Web数据抓取(Web Scraping)是指从网站上提取信息的一种计算机软件技术。Web数据抓取程序模拟浏览器的行为,能将任何可以在浏览器上显示的数据提取出来,因此也称为屏幕抓取(Screen Scraping)。Web数据抓取的最终目的是将非结构化的信息从大量的网页中抽取出来以结构化的方式存储(CSV、JSON、XML、Access、Mssql、Mysql等)。简而言之,Web 数据采集就是从指定网站抓取所需的非结构化信息数据,分析处理后存储为统一格式的本地数据文件或直接存入本地数据库中。

1.2 Web Scraping的作用

Internet是一个巨大的且迅速发展的信息资源。但大多数信息都以无结构的文本形式存在,使得信息归类变得非常困难。在Web Scraping出现之前,人们为了归类数据通常会采用手动复制粘贴的方式,这样不但费时费力,而且数据质量得不到保证,效率低。有时遇到海量数据的时候,靠人工整理甚至是无法完成。Web Scraping是一个使用计算机程序自动从目标网页中摘取某些数据形成统一格式的本地数据的过程,整个过程基本不需要人工干预。其效率较高:

(1)速度快。抓取程序的数据加载速度要比浏览器快,因为通常情况下浏览器不但要下载基本的HTML数据还需要下载相关的样式表、Java Script文件、多媒体资源,还要由渲染引擎进行页面排版布局,Java Script引擎还要进行客户端代码执行。而抓取程序只需要下载基本的HTML数据即可,这样可缩短数据下载时间。另外,程序的数据提取速度会比人工复制粘贴速度快得多,再结合多线程技术,速度更是人工所无法比拟的。

(2)准确性高。人工操作会产生信息遗漏或错误的情况,而且纠错难度大。而程序的准确性较高,即便出现问题,纠错也容易,通常只需要修改程序即可。

2 Web Scraping的原理

Web Scraping程序在计算机网络通信的传输层,使用TCP协议与Web服务器进行数据传输,在应用层使用HTTP协议与服务器进行数据交互。它与服务器的通信过程和HTTP客户端程序浏览器一致。

Web Scraping程序从功能上可以划分为两大模块:HTTP交互模块和HTML解析模块。对一个网页的抓取过程是:首先HTTP交互模块向服务器的Web端口发起TCP连接,连接建立后,交互模块即可向Web服务器发送HTP请求报文,当HTTP交互模块接收到服务端的应答报文后,进行HTTP包拆封,提取其中的HTML数据,然后将数据交由HTML解析模块进行数据解析和提取,最后解析模块将提取的数据以格式化的形式存储于数据库系统或者是简单的结构化的文本文件(CSV、TSV、XML等)。整个流程如图 1所示。

图1 Web Scraping的原理

Web Scraping程序对一个网站的采集过程就是分别对网站内感兴趣的每个页面采集的集合。为得到网站所需要采集的页面地址,需要首选对网站的结构进行分析,总结出页面的规律,例如,网站通常会有一些信息集中的列表页,通过遍历这些列表页即可得到所有详细页面的地址。

对于某些网站在于服务器交互的过程中可能会用到Cookie,这时就需要抓取程序还能够对HTTP报文中的Cookie进行管理,例如,当服务端的应答报文中含有Set-cookie字段时,要提取Cookie数据并在客户端存储或更新;之后发送请求报文时,要将Cookie一并发回服务端。

HTML解析模块负责对HTML数据进行提取和规范化处理,然后将数据以结构化的形式存储。

3 基于Python的Web数据采集方案

Python是一种面向对象、直译式计算机程序设计语言。其语法简捷而清晰、可读性强、便于维护,并且具有丰富和强大的类库[1]。为Web Scraping程序开发提供了便利:可以使用HTTP通信模块urllib2完成与Web服务器的数据交互,使用 cookielib模块进行Cookie管理,使用re模块进行文本提取[2],使用XPath相关库进行HTML解析。总之,Python提供了 Web Scraping程序的所有功能模块,利用Python可以最少的代码完成功能强大的功能。

3.1 实现HTTP交互模块

Python的urllib2模块包含于Python的标准库中,它定义了一些类和方法主要用于实现对HTTP通信协议的支持。urllib2支持HTTP代理、HTTP简单认证、跳转、Cookie等功能[5]。urllib2模块还支持对 HTTP请求报文的头和实体进行增改,对HTTP应答报文的头和正文进行读取。

如何利用urllib2模块进行HTTP交互?urllib2.urlopen(url[,data][,timeout])方法提供了最基本的HTTP请求构造和HTTP应答处理功能。url参数指示了一个要下载的资源路径。当data参数为空时预示着将发出一个GET类型的请求,该请求不包含任何实体;当data参数为非空时预示着将发出一个POST类型的请求,data的内容即为请求的实体内容。timeout参数指示了请求超时的时间。

urllib2.urlopen方法调用的结果有两种情况:

(1)出现了HTTP错误。例如,网络异常或Web服务异常造成的请求超时错误;服务端返回HTTP错误码。这时urllib2.urlopen会抛出一个异常,可以通过捕获不同的异常类型进而判断错误的种类[5]。

(2)没有出现HTTP错误。这时urllib2.urlopen返回一个类似文件的对象,通过调用该对象的read()方法可获取到应答返回的正文内容(HTML)。如果返回是经过gzip压缩过的数据,在这里还要手动进行gzip解码。

cookielib模块也包含于Python的标准库中,它主要用于对Cookie进行管理[5],urllib2通过cookielib库实现对Cookie自动维护。

3.2 实现HTML解析模块

通过HTML交互模块可以取得网站页面数据,但是此时的数据粗糙,字符编码不确定,结构混乱甚至不符合XML规范。所以首先要确定文档的字符编码,通过<head>中的content-type元得到。然后将其解码成unicode类型[3],目的是保证后续数据提取过程中的编码一致性,以及最终数据存储方便。

正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的工具。利用正则表达式可以方便地从一堆复杂的文本中找到与规则相匹配的子串,许多程序设计语言都支持利用正则表达式进行字符串操作。在Python标准库中re是一个用来进行正则表达式相关操作的模块[6]。通过对目标页面结构进行分析,通常能够在感兴趣的字符串周围找到其他有标志性的字符,可以通过这些字符构造出正则表达式,利用re模块进行数据提取。

XPath:是一门在XML文档中查找信息的语言,用于在XML文档中通过元素和属性进行导航。利用XPath可以方便地在HTML文档中定位感兴趣的节点。lxml库是 Python的第三方库,它支持标准的XPath 规范[7]。

通过正则表达式和XPath的结合就可灵活地从HTML中提取任何感兴趣的信息。在提取到数据之后还要对其进行规范化处理,比如将HTML转义字符进行反转义、去除冗余的HTML标记、去除冗余的空白字符。

3.3 数据结构化存储

结构化数据通常指的是行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据。Web Scraping程序最终输出的数据是结构化的,具体存储于各种数据库系统或文件中。在unicode数据进行本地化存储之前必须要先进行字符编码,具体的编码方式可以根据需要选择,一般是由数据最终的应用环境决定的。比如,最终的数据将应用在一个字符编码为UTF-8的网站上,那么就要选择以UTF-8的编码进行存储。

4 结束语

介绍了Web数据抓取技术以及其实现的原理,以及如何利用Python进行Web数据抓取程序的开发。Web数据抓取技术已在非结构数据结构化、Web程序自动化操作、定制搜索引擎爬虫、舆情监控等方面发挥重要作用。同时,为保护好自己的Web资源不被别人恶意采集,要做好应对措施,限制网站单个IP的并发连接数,可以使用Ajax动态加载网页内容或者将应答内容进行加密,将一些敏感的信息以非文本的形式展现,都会给数据采集造成障碍。

[1]赫特兰.Python基础教程[M].2版.北京:人民邮电出版社,2010.

[2]丘恩.Python核心编程[M].2版.北京:人民邮电出版社,2008.

[3]鲁特兹.Python学习手册[M].北京:机械工业出版社,2009.

[4]桂小林,汪宁波,李文.基于XML的远程教育课件规范化的研究与实现[J].电子科技,2010,23(6):129 -131.

[5]刘红梅.脚本语言在数据采集系统中的应用研究[J].电子科技,2009,22(11):72-75.

猜你喜欢

字符结构化报文
基于J1939 协议多包报文的时序研究及应用
促进知识结构化的主题式复习初探
改进的非结构化对等网络动态搜索算法
CTCS-2级报文数据管理需求分析和实现
结构化面试方法在研究生复试中的应用
左顾右盼 瞻前顾后 融会贯通——基于数学结构化的深度学习
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
浅析反驳类报文要点