php抓取ajax页面返回图片。
要抓取的页面:http://pic.hao123.com/
当我们往下滚动的时候,图片是用ajax来动态获取的。这就需要我们仔细分析页面了。

可以看到,异步加载的ajax文件为:
http://pic.hao123.com/screen/1?v=1375797699944&act=type
我们之间用浏览器打开这个网址,发现只返回一个 空数组[]。但是我们在http://pic.hao123.com/页面调试时发现它
确实返回了一条图片数组:
ajax请求:

返回值可以看到是一个json 数组。说明服务器端会检测referer。我们需要用curl来设置它为正确的值。
请求的v是一个随机数。

每次请求会返回一个有30个元素的array,每个元素都是一个对象,有一个picurl_orig属性,
这个属性就是大图的真实地址。
完整代码如下:
<?php
/*
抓取
http://pic.hao123.com/
图片,
图片是ajax动态载入的。
*/
function replaceBadChar($fileName)
{
// 去掉文件名中的无效字符,如 \ / : * ? " < > |
$fileName=str_replace('\\','_',$fileName);
$fileName=str_replace('/','_',$fileName);
$fileName=str_replace(':','_',$fileName);
$fileName=str_replace("*",'_',$fileName);
$fileName=str_replace("?",'_',$fileName);
$fileName=str_replace('"','_',$fileName);
$fileName=str_replace('<','_',$fileName);
$fileName=str_replace('>','_',$fileName);
$fileName=str_replace('|','_',$fileName);
return $fileName;
} $dir="images/";
$startTime=microtime(true);
if(!file_exists($dir)) mkdir($dir,0777);
set_time_limit(0);
$i=1;
$j=1;
while($i<10)
{
/*
$url='http://pic.hao123.com/screen/'.$i.'?v='.time().'&act=type';
$file=file_get_contents($url);
*/
$url='http://pic.hao123.com/screen/'.$i.'?v='.time().'&act=type';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, "http://pic.hao123.com/"); //构造来路 curl_setopt($ch,CURLOPT_HEADER,0);//不获取header信息
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch); curl_close($ch);
//print_r($out);
$data=json_decode($out); //array
//print_r($data);
//print_r($data[1]->picurl_orig); if($data)
{
foreach($data as $k=>$v)
{ print_r($v->picurl_orig);
print_r("<br/>"); $imgUrl=$v->picurl_orig; //$newFile=$dir.pathinfo(replaceBadChar($imgUrl),PATHINFO_BASENAME);
$newFile=replaceBadChar($imgUrl);
$newFile=$dir.$newFile;
// $contentType=$_SERVER['CONTENT_TYPE'];不能,undefined index
$ch2=curl_init($imgUrl);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch2);
$contentType=curl_getinfo($ch2,CURLINFO_CONTENT_TYPE);
//输出如:image/jpeg"
curl_close($ch2);
print($contentType."<br/>");
$ext=substr($contentType,6);
//有些图片是网址格式如 http://img.hb.aicdn.com/0c6012d12407da6b2adafc4f02779cb013a63a011dc69-x2q4Fz
$suffix=strrchr($imgUrl,'.'); print $suffix."<br/>";
if($suffix!='.jpeg' && $suffix!='.jpg' && $suffix!='.png' && $suffix!='.gif')
{
$newFile.='.'.$ext;//添加扩展名
} file_put_contents($newFile,file_get_contents($imgUrl)); //print $i."_".$j.'_'.$imgUrl+" is ok<br/";
$j++; }
}
else
{
echo 'img is all and usertime '.(microtime(true)-$startTime);
die();
}
$i++; }
在下载图片时,有些图片是网址格式:
http://img.hb.aicdn.com/0c6012d12407da6b2adafc4f02779cb013a63a011dc69-x2q4F
有些是
http://sxsx.jpg
这个格式,一个有后缀名,一个没有。
这就需要我们检测http页面的Content Type。
用
$contentType=curl_getinfo($ch2,CURLINFO_CONTENT_TYPE);
获取Content -type;
返回形如:
image/jpeg
的形式。
我们就可以
$ext=substr($contentType,6); 获取扩展名。 参考:http://www.php10086.com/2013/01/1278.html
php抓取ajax页面返回图片。的更多相关文章
- C#抓取AJAX页面的内容
原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...
- 用C#抓取AJAX页面的内容
现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行的! 但我们用IE浏览页面时是正常的 ...
- php抓取一个页面的图片
思路: 1.找到一个页面 2.正则过滤所有的img 3.正则过滤出所有的src的属性 4.获取链接信息,写入文件 file_get_contents(), file_put_contents() 5. ...
- 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法
下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片 将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...
- scrapy实战4 GET方法抓取ajax动态页面(以糗事百科APP为例子):
一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析.本篇文章则是通过利用fiddler抓包获取j ...
- 如何让搜索引擎抓取AJAX内容? 转
越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...
- 如何让搜索引擎抓取AJAX内容?
越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...
- Python抓取网页中的图片到本地
今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...
- PHPcurl抓取AJAX异步内容(转载)
PHPcurl抓取AJAX异步内容 其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参 ...
随机推荐
- 扩展ASP.NET MVC HtmlHelper类
在这篇帖子中我会使用一个示例演示扩展ASP.NET MVC HtmlHelper类,让它们可以在你的MVC视图中工作.这个示例中我会提供一个简单的方案生成Html表格. HtmlHelper类 Htm ...
- linux-0.11抠代码-GDB+VMWARE
vmware新建一个虚拟机,硬盘为0.1G,建立完成后要先启动一次虚拟机,此时无任何系统,然后再关闭,应该会多出一个ostest-flat.vmdk这个虚拟磁盘文件,下面要用到 新建完成后 我的虚拟机 ...
- Cocos2d-x C++调用Android弹出提示框
转载请注明地址,谢谢.. Cocos2d-x中提供了一个JniHelper类来让我们对Jni进行操作. (PS:弄了一天想自己写代码操作Jni的,但是总是出错,技术差不得不使用Cocos2d-x现成的 ...
- 2014 android毕设代做 代做Android毕设 安卓毕设
近期略有闲暇. 看到部分老友帮忙做毕业设计. 一来能够锻炼下小技能,二来能够得点零花小钱. 心遂小动.跃跃欲试. 毕设这件事情,个人觉得还是自己做的好. 只是每一个人都有各种各样的原因不能自己完毕. ...
- .net Windows服务程序和安装程序制作图解
最近项目中用到window服务程序,以前没接触过,比较陌生,花了两天的时间学习了下,写了个简单的服务,但在制作安装程序的时候,参照网上很多资料,却都制作不成功,可能是开发环境或项目配置的不同,这里把自 ...
- javaweb学习路之二--上传gitgub
代码上传github 代码上传到github的步骤 第一步:申请github账号 https://github.com/注册账号 第二步:登录github,新建repository仓库,命名,创建 第 ...
- 把Orchard部署到Windows Azure Web Sites
很久前就想做个人站点,主要用来记录自己的生活,我喜欢摄影,烘焙…然后又刚刚入皮坑,这些都可以放在网站上展示一下,或许还能为自己带来收入. 然后手上刚好有Azure的试用,于是乎动力就上来了. 以下是部 ...
- JDBC:Java连接数据库的桥梁
JDBC(Java DataBase Connection),java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 ...
- C++之对象存储空间_对象模型
C++编译器如何完成面向对象理论向计算机程序的转化 #include<stdio.h>//////c++对象模型和结构体一样 class Test { ...
- jacksonall的使用,解析json
转自:http://www.cnblogs.com/lee0oo0/archive/2012/08/23/2652751.html , Jackson可以轻松的将Java对象转换成json对象和xml ...