使用cygwin下的wget采集特殊的网页内容

需要采集一批数据,是一网站上的产品信息,产品本身信息很简单,使用火车采集器轻松实现;但产品价格数据是ajax响应数据,使用firebug + live http headers抓到该请求,并测试重发,发现该ajax请求必须带一个http头“X-Requested-With: XMLHttpRequest”,没有就返回404错误。

gnu/linux下有大量的杀手级工具,这种情况,要动用其中的wget. wget有很多参数,这里需要使用其中两个:-O,–header. 其中:

-O, 把请求结果保存到指定文件,但我们要使用的却是一个特殊的值:“-”,它可以将结果输出到标准输出

–header, 结http请求加上自定义的头(http header)

于是对于每条产品数据,都发送这样的请求:

wget –header=”X-Requested-With: XMLHttpRequest” -O save_123.txt “http://www.website.com/request/path/?Id=123”

这样每条产品都保存到save_123.txt,save_124.txt,save_125.txt….这样的一系列文件中。不过有个问题是,每条数据一个文件,后期分析不方便。所以将其存储到单一的文件里。

方案:先将wget结果指向到标准输出,然后再使用重定向符 >> 定向到单一的文件里。

不过,还有一个问题,每个http响应里没有产品id号,数据跟采集到的产品信息对不上号。于是在每写一笔采集结果前,往文件里先写入该产品的id号。

这里使用echo 命令,要用到echo 的参数:-e, 作用是使用转义符输出换行。示例:echo -e “aaa\nbbb”

于是构造这样的bash脚本:

echo -e "\n"10011"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10011" >>data.log; 
echo -e "\n"10012"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10012" >>data.log; 
echo -e "\n"10013"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10013" >>data.log; sheep 1;
echo -e "\n"10014"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10014" >>data.log; 
echo -e "\n"10015"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10015" >>data.log; 
echo -e "\n"10016"\t"  >>data.log ;wget --header="X-Requested-With: XMLHttpRequest" -O- "http://www.website.com/request/path/?Id=10016" >>data.log; sheep 1;

第三行加一个sheep 1, 即每采三条暂停1秒钟,作用是防止请求过于密集而影响服务器响应,暂停秒数按实际情况设置。

所有数据都保存到data.log文件里,里面格式如下

10011    
{"data":.....}
10012    
{"data":.....}
10013    
{"data":.....}
10014    
{"data":.....}

每两行一笔数据,其中第一行是产品id号,第二行是采集到的数据。这样就可以方便的提取其中数据了。

其实,对于而需要提取的数据,完全可以通过grep从定向到标准输出的wget结果里提取。只是这里不么做了。

 




coded by nessus
发表评论?

0 条评论。

发表评论