APP下载

抓取HTTP协议POST文本数据方法设计

2016-10-18刘一峰,刘冰,郭良动

中国科技信息 2016年18期
关键词:报头字段流程图

抓取HTTP协议POST文本数据方法设计

21世纪是信息时代。当前的万维网是一个巨大的存储、共享文本和图像信息的分布式媒介,计算机是展现文字或图像的一个平台。从万维网上获取文本资源的集合可以作为Web挖掘的语料库。随着信息科学技术的发展,基于HTTP协议POST请求的文档量占的比重越来越大,研究如何快速并准确地从万维网中抓取POST请求类型的文本数据能够丰富Web挖掘技术的语料库,同时对其他需要大量POST文本数据的行业也有一定的意义。

本课题主要研究如何从万维网中抓取带有持续Cookie(persistent cookie)的POST文本数据。现以Windows 7的32位系统作为测试平台,以eclipse Mars.1为开发平台,研究一个快速抓取POST文本数据的方法。

HTTP协议概述

HTTP协议,即超文本传输协议(Hyper-text transfer protocol),是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是一个应用层协议,由请求和响应这两种报文组成。请求方法有8中类型,GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT和OPTIONS等。其中GET和POST是最常见的两种请求方式。GET是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。POST则用来向目的服务器发送请求,要求它接受背负在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,POST被设计成用统一的方法实现下列功能:

对现有资源的解释;

向电子公告栏、新闻组、邮件列表或类似讨论组发信息;

提交数据块;

通过附加操作来扩展数据库等。

POST请求报头信息分析

请求报头允许客户端向服务器端传送请求的附加信息以及客户端自身的信息。例图1介绍了一个典型的POST请求报头,它主要包含以下字段:Accept字段表示浏览器支持的MIME(Multipurpose Internet Mail Extensions)类型;Accept-Encoding字段表示浏览器有能力解码的编码类型;Accept-Language字段表示浏览器所支持的语言类型;Connection字段表示客户端与服务器连接的类型; Content-Type字段表示网络文件的类型和网页的编码格式;Cache-Control字段指定了请求遵循的缓存机制;User-Agent字段表示浏览器版本信息;X-Requested-With字段的值为XMLHttpRequest表示请求是Ajax异步请求,值为null表示请求是传统同步请求;Host字段表示请求的服务器网址;Cookie字段是一些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端商的数据。

表1 POST请求报头数据格式

POST文本数据抓取方案设计

抓取POST文本数据的基本流程如图1。首先,需要读取字符串url,并根据字符串url建立URL类的实例postURL,此后需要建立postURL连接,这将返回一个HttpURLConnection类的对象connection,此时并没有创建实际的网络连接。其次,要给对象connection设置连接属性,其中,首先要调用setRequestMethod方法将请求方式设置为POST;其次需分调用setDoOutput和setDoInput方法将参数都设置为true,这是因为POST请求的参数是放在http正文内;此后,需要调用setRequestProperty方法,该方法有两个参数分别是key和value,参数key可参考表1中第一列的数据来设置,参数value的值与表1中第二列的数据类似,针对来自不同的源的POST网页可依照抓包代理工具中捕获的POST请求报头信息来设置key和value的值。设置好连接属性后,就可以调用connection对象的connect方法来打开到postURL引用的资源的通信链接。应该注意的是,设置连接属性必须在打开连接之前,否则将会发生错误。最后,建立字符输入流对象读取文本数据并保存到本地,流程结束。

若要批量抓取POST文本数据,需要对图1中描述的方案的流程进行改进。在给对象connection设置连接属性这一步骤中,有一个字段为Cookie。Cookie分为非持续Cookie(nonpersistent cookie)和持续Cookie(persistent cookie)。如果没有给Cookie设置过期时间,则Cookie会在关闭浏览窗口时消失,这样的Cookie被称为非持续Cookie。非持续Cookie一般被保存在内存里。如果设置了Cookie的过期日期,则它将被一直保存直到过期位置,这样的Cookie被称为持续Cookie。 火狐浏览器的持续Cookie被保存在数据库cookies.sqlite中,过期日期由expiry字段记录。获取持续Cookie的方法有以下两种:

连接数据库cookies.sqlite,选择表moz_cookies,读取name、value和expiry字段的值;

建立WebDriver类的对象打开浏览器,建立并打开url链接后获取cookie的name、value和expiry字段的值。

第一种方法在数据库cookies.sqlite中表格的数据没有加密的情况下可通过Class.forName(org.sqlite. JDBC)连接SQLite的JDBC来实现。第二种方法的原理是在打开浏览器并打开url链接时保存服务器向客户端发送的Cookie。显然,第二种方法比第一种方法更加通用。因此,本课题采用第二种方法来获取Cookie,流程图见图2。

采用图2中描述的方法可以完整地得到Cookie的name和value,又根据持续Cookie有过期日期的特性,设计出了批量抓取POST文本数据的流程图,见图3。当保存好当前抓取到的文本数据后,并在抓取下一个页面前,需要判断当前日期是否在Cookie的过期日期之前。若为真,说明此前得到的Cookie仍然有效,可继续使用;若为假,需要刷新网页重新抓取Cookie和过期日期。由于在获取Cookie的过程中打开了firefox浏览器,因此抓取完预计的所有页面后,需要关闭浏览器,到此整个流程结束。

图1 抓取POST文本数据的基本流程图图2 获取持续Cookie流程图

图3 批量抓取POST文本数据流程图

实验结果

调试好各模块的程序后,需配置好URL和文本的保存路径。以中国裁判文书网为例,运行程序,见表2所示的统计结果。

表2 实验结果

结束语

本文介绍了抓取POST文本数据的详细步骤,在执行抓取文本程序的过程中,曾出现过返回502 Bad Gateway的HTTP状态消息的情况。这是由于服务器从上游服务器收到一个无效的响应。此种情况可通过记录抓取进程的方式解决,在再次执行程序时就不会出现抓取重复文本的错误。通过反复的实验,验证了此种抓取方式的可行性,并且操作简单。

10.3969/j.issn.1001- 8972.2016.18.006

猜你喜欢

报头字段流程图
浅谈台湾原版中文图书的编目经验
一种程序源代码的标准化流程图转化方法∗
报业文化中的一道独特风景
国家网络空间安全发展创新中心郭毅IPv6协议栈脆弱性分析
题名与责任说明附注字段用法分析
淡妆浓抹总相宜
——对中国晚报报头变化的研究与欣赏
无正题名文献著录方法评述
无正题名文献著录方法评述
宁海县村级权力清单36条
简论报纸的报头设计