PHP-php如何抓取动态页面的数据

发布于 2016-10-15 21:17:27 字数 316 浏览 1807 评论 3

http://jipiao.kuxun.cn/beijing-shanghai.html?2012-07-21
现在要抓取酷讯旅游网的机票信息,可是他这个信息是动态生成的貌似调用了ajax
我怎么才能抓取他的信息呢,很奇怪的是在百度上搜还能都到酷讯的机票信息
百度是怎么收录这些动态的信息呢,求解答
百度上搜索“机票 中国国航 CA1857”就能搜出来

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夜无邪 2017-08-05 13:18:53

百度是怎么抓取不太清楚,不过你可以看看它Ajax调用的URL,然后再抓取这个地址,因为Ajax加载的内容本身不在HTML的源代码里显示,所以通过CURL或者是file_get_contents函数都是抓取不到的,不过你可以分析它的源代码及相关规则后再抓取

偏爱自由 2017-04-03 07:33:28

抓取这个站的数据比较复杂,页面好几块都是异步加载的,页面加载完毕就会有15个左右XHR请求。首先要弄清楚是那个请求返回的是你想要的数据,比如:
http://jipiao.kuxun.cn/internal_v2/ajax.php?from=PEK&to=SHA&date=2012-07-21&queryid=8e99dbcdcc58c75c&action=getSingleData_v3&p=1167634238556&fn_md5=&emptyrec=0&ota_md5=
得先弄清楚每个参数的意思,然后才可以自己构造,直接访问不可以,做了referer验证,抓取这个地址如下代码:

 $aContext = array(
'http' => array(
'method' => 'GET',
'header' =>"Referer:http://jipiao.kuxun.cn/beijing-shanghai.htmlrn"
),
);
$cxContext = stream_context_create($aContext);

$cont = file_get_contents("http://jipiao.kuxun.cn/internal_v2/ajax.php?from=PEK&to=SHA&date=2012-07-21&queryid=8e99dbcdcc58c75c&action=getSingleData_v3&p=1167634238556&fn_md5=&emptyrec=0&ota_md5=", False, $cxContext);

echo $cont;

响应的数据完全不知道是啥,需要找对网站相对应的处理数据的js,才能处理出页面显示的效果, 总体来说抓取这个网站有难度。
还有一个思路就是模拟百度去抓取,不知道是否可行

归属感 2017-02-28 06:33:13

解决方案:直接抓取 http://jipiao.kuxun.cn/beijing-shanghai.html?2012-07-21#page_loc 的内容然后进行 html 分析即可。比如使用方式,代码如下:

$url = "http://jipiao.kuxun.cn/beijing-shanghai.html?2012-07-21#page_loc";  
$contents = file_get_contents($url);  
//如果出现中文乱码使用下面代码  
//$getcontent = iconv("gb2312", "utf-8",$contents);   
echo $contents;

这里的 $contents 就是你要获得的页面内容。

当然也可以使用curl等方法获得。个人总结整理了一下,有以下几种常用的用php抓取网页中的内容的方法,可以参考这里: https://www.wenjiangs.com/group/topic-17735.html

1.使用file_get_contents

$url = "http://www.34ways.com";  
$contents = file_get_contents($url);  
//如果出现中文乱码使用下面代码  
//$getcontent = iconv("gb2312", "utf-8",$contents);   
echo $contents;

2.使用curl

$url = "http://www.34ways.com";  
$ch = curl_init();  
$timeout = 5;  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
//在需要用户检测的网页里需要增加下面两行  
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);  
//curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);  
$contents = curl_exec($ch);  
curl_close($ch);  
echo $contents;

3.使用fopen->fread->fclose

$handle = fopen ("http://www.34ways.com", "rb");  
$contents = "";  
do {  
   $data = fread($handle, 1024);  
   if (strlen($data) == 0) {  
   break;  
   }  
   $contents .= $data;  
} while(true);  
fclose ($handle);  
echo $contents;

最后提醒几点:
1.使用file_get_contents和fopen必须空间开启allow_url_fopen。
方法:

编辑php.ini,设置allow_url_fopen =
On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。

2.使用 curl 必须空间开启curl。
方法:

windows下修改 php.ini,将 extension=php_curl.dll 前面的分号去掉,而且需要拷贝 ssleay32.dll 和 libeay32.dll 到 C:WINDOWSsystem32 下;Linux 下要安装 curl 扩展。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文