1、 春节回家,为了订到便宜机票,需要不停的刷新携程网来查看。时间一长,感觉又费时又费力,要不写个自动程序来定时检查提示该多好啊。为达到此目的,决定使用JS和HttpWatch实现自动监控低价机票的功能。以下是实现流程。帖不了附件很麻烦啊...
2、 总体流程
------------------------------------------------------------------------------------------
开始->分析页面->模拟访问URL->抓取请求返回消息->定位结果表->转化DOM对象验证
------------------------------------------------------------------------------------------
3、 分析请求页面,查看页面页文件(完整文件请看附件),有如下信息比较关键。可以看到在Form中有flightway(选择方式,单程,双程),homecity(出发点),destcity1(到达点)和DDatePeriod1(出发时间)几个对象。
------------------------------------------------------------------------------------------
<FORM id=flightForm οnsubmit="return false;"
action=http://flights.ctrip.com/Domestic/ShowFareFirst.aspx method=post>
<DIV class=searchbox_fah> <DFN>自由·机+酒特惠</DFN><A id=airHotelBtn
href="javascript:void(0);">更实惠·更便捷</A></DIV>
<TABLE class=searchbox_content_fixed>
<TBODY>
<TR>
<TH>航程类型</TH>
<TD><LABEL class=index_label><INPUT type=radio CHECKED value=Single
------------------------------------------------------------------------------------------
4、对于flightway和DDatePeriod1比较容易确认内容,但对于homecity和destcity1内容是中文、汉语拼音,还是代码,只有测试后才知道。先后试了中文、汉语拼音后还是不行。再次查看源代码,发现了如下关键信息。这不就是航空城市代码吗,试了一下,可以了。然后筛出自己关心的两个代码:KMG(昆明)和NKG(南京)。附件是测试代码
-----------------------------------------------------------------
$.module.searchBox.airHotelList="BJS,SHA,CKG,DLC,TAO,NKG,HGH,XMN,CTU,SZX,CAN,KWL,KMG,LJG,CSX,SIA,WUH,TSN,HRB,KWE,URC,HAK,HET,TYN,FOC,HFE,NGB,KHN,NNG,SHE,WNZ,CGO";
$.module.pkgSearch.pkgStartCityHash={
-----------------------------------------------------------------
5、完成以上几步分析后,可以大致通过代码查询到机票信息。剩下的工作就需要使用到HttpWatch(版本6.0.14,低版本可能会导致抓取数据乱码无法解析)来完成请求返回数据的抓取。把查询请求信息先拼接为URL串(http://flights.ctrip.com/Domestic/ShowFareFirst.aspx?homecity=KMG&destcity1=NKG&DDatePeriod1=2011-02-13)。
6、通过HttpWatch查看返回的请求详细信息,分析后知道http://flights.ctrip.com/Domestic/ShowFareFirst.aspx这个请求里包含了所需的详细信息,主要的处理也针对这个URL项来处理。附件为该请求的返回消息内容。
7、开始编写测试驱动代码,使用了HttpWatch的IE控件(只需要安装HttpWatch即包含了IE控件)。编写RetryManage对象,主要包含了一些常量定义和一些用到的变量。CONST_URL是请求的URL,MATCH_URL是用于匹配HttpWatch返回请求结果列表中我们关心的URL(一个URL请求中,服务器会返回多个URL项,包括js、图片、页面信息等内容)。MATCH_BEG_MSG是在匹配到我们所关心的信息后,从信息中找到我们关注的HTML标记。MATCH_END_MSG是结束HTML标记(查找方式很多,本例仅使用indexOf方法来获取特定内容在整个字符串的开始、结束序号,用以确定子串内容,该方法并不好,随着网站的变化就会失效)。Control保存HttpWatch控制对象(只需获取一次即可),plugin保存HttpWatch的对应IE的ActiveXObject对象。isReady表示是否上下文环境是否已准备好
-----------------------------------------------------------------
function RetryManage()
{
// const url for air tickets query
this.CONST_URL = "http://flights.ctrip.com/Domestic/ShowFareFirst.aspx?homecity=KMG&destcity1=NKG&DDatePeriod1=2011-02-13";
// const url for match query
this.MATCH_URL = "http://flights.ctrip.com/Domestic/ShowFareFirst.aspx";
// const begin match tickets fee table
this.MATCH_BEG_MSG = "<table