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和传值的参 ...
随机推荐
- ThinkPHP 3.1.2 查询方式的一般使用1
public function show(){ echo "访问了index模块下的show方法!!"; echo "欢迎你".$_GET['name'].'你 ...
- JAVA面试中的几个重要基础问题
1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...
- Android手机设置隐藏命令大全
注意:因Android版本较多,固有部分隐藏命令或不能使用 *#*#4636#*#* 显示手机信息.电池信息.电池记录.使用统计数据.WiFi 信息 *#*#7780#*#* 重设为原厂设定,不会删除 ...
- css两列布局,一边固定宽度,另一边自适应
<!DOCTYPE HTML><HTML> <head> <meta charset="utf-8" ...
- GNU自动补全模块readline解析
readline模块定义了一系列函数用来读写Python解释器中历史命令,并提供自动补全命令功能.这个模块可以通过relcompleter模块直接调用,模块中的设置会影响解释器中的交互提示,以及内置函 ...
- Python之路Day15
主要内容:WEB框架.Django基础 WEB框架 Web请求流程 -- 原始Web框架 -- 自定义Web框架 -- MVC 和 MTV # Models Views Controllers # 模 ...
- MVC项目中如何判断用户是在用什么设备进行访问
使用UAParser在C#MVC项目中如何判断用户是在用什么设备进行访问(手机,平板还是普通的电脑) 现在我们开发的很多web应用都要支持手机等移动设备.为了让手机用户能有更加好的用户体验,我们经常为 ...
- Linux的起源、特点和版本号
前言 最近上陈渝老师的<高级操作系统>,需要在ucore实验平台上完成一个麻雀虽小五脏俱全的OS,本着看过一小半<30天自制操作系统>的自信,以为这不过是小case,怎料被虐得 ...
- C++惯用法:通过成员模板实现隐式转换(Coercion 强迫 by Member Template)
Intent To increase the flexibility of a class template's interface by allowing the class template to ...
- zoj p3780 Paint the Grid Again
地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5267 题意:Leo 有一个N*N 的格子,他又有一把魔法刷,这个刷子能把 ...