需要采集一批数据,是一网站上的产品信息,产品本身信息很简单,使用火车采集器轻松实现;但产品价格数据是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文件里。
其实,对于而需要提取的数据,完全可以通过grep从定向到标准输出的wget结果里提取。只是这里不么做了。
发表评论