项目中遇到需要采集某个网站的数据,经过查看发现它用的是百度的站内搜索技术。站内搜索,采用的是ajax的技术,通过请求获取百度返回的json字符串,写入到页面中的。随后尝试了许多的方法,去采集他的数据,都是失败了。
于是,我就上百度去搜索了一下,都是一些泛泛之谈,没有实际的用处。最后,想想还是自己去研究吧。
在我不断的努力和找人咨询的情况下,终于,得到了下面的教程《火车头采集ajax数据 》。
第一步:分析
上面说了,百度的站内搜索返回的是json字符串,那么只要我们找到这个发送请求的地址,接收返回的值,对值进行处理就可以了。
第二步:获取请求的参数值
为了得到返回的json值,我们要找到提交的地址。在这里,可能有很多小伙伴想到了,火狐的firebug。我也尝试了,可是没有得到我想要的信息。
于是,我就在网上下载了一个抓包工具,Fiddler软件。百度软件库里就有。下载之后,打开软件,在浏览器搜索框中,输入你要搜索的内容。【回车】之后,你在fiddler里面查看,获取的数据。如下图:
第三步:分析抓包工具返回的数据。
1) 图中标记1的区域,是我们发现的百度站内搜索的地址。
2) 图中标记2的区域,是我们获取到的地址链接里面的所有参数。
3) 图中标记3的区域,是我们看到的百度站内搜索返回过来的json字符串。
那么,我们想要获取的三个元素,第一,地址有了;第二,参数有了;第三,返回的json数据也有了
有了这三个必要的条件,我们只要将,需要的参数组装成自己想要的参数链接,扔给百度,我们得到想要的值就好了嘛。
第四步:将获取的参数,组装成想要的请求网址。我这边是用php模仿get请求的方式。下面的代码的核心地方就是,我们要模拟一个referer值,相当于百度的令牌,你要是没有的话,百度是不会把数据返回给你的。
代码如下:
1. <?php
2.
3. 下图中的参数,是根据实际中需要填写的,这里是最基础的代码,自行修改。
4.
5. $ch = curl_init();
6. $timeout = 5;
7. curl_setopt ($ch, CURLOPT_URL, ‘http://www.shuchengxian.com/');
8. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
9. curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
10. $file_contents = curl_exec($ch);
11. curl_close($ch);
12. echo $file_contents;
13. ?>
如上图所示:重要的几个参数,都标记出来了。代码上传不了,很忧伤,只能发图。
q ---> 我们搜素的关键字
cc----> 我们要采集网站的网址
p-----> 分页的代码,从0开始的。
第五步:我们在浏览器段,执行我们的数据。
如图所示:
图中红色标记的地方,就是json字符串的字段名。现在我们值都可以获取到了,那么就把他放入火车头吧。
第六步:将文件放入火车头中采集。
如图:
这里的添加页数的变量,可以在程序的页面,将P后面的参数,改为变量,就可以了。
如上图所示,我们就拿到了,我们想要采集的数据网址,然后你可以将火车头数据库中的网址,全部的提取出来,组装成链接,就可以开始采集数据了。
终于写完了,火车采集ajax数据,采集百度站内搜索,就是这样的。