这段时间接到一个抓取任务,任务的目标是,对Http://www.hzti.com网站的违章数据进行抓取,刚接到这个任务粗略的分析了一下网站代码的格式,认为这个任务在一天之内就能完成(应该还可以省下一点时间看看新闻。。:))。
由于以前用Nutch对网站进行抓取过,所以我认为只要完成网页有效数据的提取就等于完成了这个任务。三个小时过后提取部分测试通过,我将代码组装到Nutch(Nutch经过我的修改已经面目全非了)上,实施抓取。抓取的测试链接为:http://www.hzti.com/wzcx_1.asp?search_exist=1&search_cartype=0&search_value=浙A88124 ,几次调试过后,没有得到预期的网页,单步跟踪后,一直被忽略的问题发现了,原来我以前抓取的数据都是用Get方式提交的,而这次不一样,是用Post方式提交的,所以虽然测试链接在浏览器中可以取得预期的网页,但是并不能用Socket通过Get方式取得预期的网页。(到这里才觉得问题不是那么简单)一天过去了。。。:)
为了将Get方式的Socket连接改成Post方式的,我安排了一个上午的时间在网上搜索资料。根据网上的资料显示,Post方式提交的表单比Get提交的数据量大,而且Post可以提交不可见的数据,所以问题变为怎么得到网页Post的数据。关于Post方式访问网站的资料一大堆,可是却没找到“怎么才能得到一个页面Post方式提交的数据”,在大量搜索无果的情况下,只有向朋友求助。又过了一天。。。:)
经师兄(陈恩)指点用网络嗅探器可以得到浏览器提交的全部信息,所以又一次搜索,先后找到了三个嗅探器(Visual Sniffer,Effetech Sniffer,URLSnooper)Visual Sniffer只能得到服务返回给浏览器的数据,Effetech Sniffer则安装后总是报错(PCAP error: Error opering the networking adapter!),好在URLSnooper实现了我的目的,分析到了如下数据:
POST /wzcx_1.asp HTTP/1.1
Accept: */*
Referer: http://www.hzti.com/search/wzseach.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; i-NavFourF; TencentTraveler ; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.hzti.com
Content-Length: 51
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDCQTCQQRR=GIGJOKMDNNBKAKEOMDHGLPEB
search_exist=1&search_value=a88124&search_cartype=0
将这些信息代入程序,成功的得到了预期的数据。。。。