关于PHP自定义采集图片脚本

上次看了韩顺平老师的自定义数据采集脚本视频,自己手痒了也想自己写一个玩玩,不料!就是这几十行的代码,我整整敲了一天才算完美过关,各种坑爹的事情不由分说,下面我来谈谈我深刻的体会!

因为是自己看着视频敲的,思路跟着视频走,但是还是很容易写错字符,或者错漏字符,当然了,我也没庆幸一遍就写完整(态度还是蛮好的),比如,在拼接GET请求的时候丢了拼接符号(.),稍微一看没错啊!心里肯定是人家防采集了(屁大点的网站,防个毛的采集),这个退缩的理由,让我在采集这边一直不敢去深究,采集要用到正则,而正则只是在我开始学习PHP的时候,看过一点点,知道是个怎么回事,其他的就不了了之,心里没底气呀,还好经过昨天跟今天,通过Discuz论坛的DXC采集跟Dedecms后台采集的反复研究,最终能够采集到数据,我还是挺欣慰的,这一关算是过了吧。

再其次,还是在模拟浏览器发送请求的时候,其中Host中的ost字符我一直跟着视频用的大写(HOST),但是老师视频里是能够正常请求相应到数据的,而我就是死活弄不出来,差点就放弃了,估计又要陷入深深的自卑当中吧,还好不厌其烦的我,用火狐Debug了一下,根据发送请求字符一个个对,当把host改过来就通过了,那一刻我想死的冲动都有了。

这个也许是最坑爹的吧,耽误了我几个小时,但是,下面还有更坑爹的,截掉头部信息,以及后面的几个字符串,才能获取到图片流的真正二进制码啊,视频里讲是后面11个字符,我也想过可能不一样,就把8到15都试了一遍,采集到的图片还是无效显示,接着又用狐火右键源码看了一把,把字符从0开始截取,最终测试结果是头部后面4个字符,才是图片的二进制码,调这个我也差点疯了,先是head(Content-Type:image/jpeg)浏览器显示图片,再是写入到text文件中看代码,又是Unicode编码保存等问题,又是PHP流的问题,跟着别的知识倒是看了不少,也许是视频老了吧,各种不合适。

所以,这些关键技术,还是要自己一点点过关才行,下面贴一下坑爹的代码:

<?php 
	
	set_time_limit(100);
	//1.连接到服务器(主机)网站
	$fp = fsockopen("www.a67.com",80,$error,$errstr,30);
	if(!$fp){
		die("连接失败 $error - $errstr");
	}
	
	//2.准备发送HTTP请求
	$httpstr = "GET /list/1/p.2 HTTP/1.1\r\n";
	$httpstr.= "HOST: www.a67.com\r\n";
	$httpstr.= "Connection: Close\r\n\r\n";
	
	//3.发送HTTP请求
	fwrite($fp,$httpstr,strlen($httpstr));
	
	//4.接收从a67返回的静态页内容
	$res="";	
	while(!feof($fp)){ //使用while循环读取,防止消耗高内存
		$res.=fread($fp,1024);
	}
	fclose($fp); //关闭连接,关闭文件流
	
	//5.现在使用正则表达式取出图片的路径
	$reg = '/<img alt="[^"]*" title="[^"]*" src="([^"]*)"/'; //子表达式
	preg_match_all($reg,$res,$arr);
	//print_r($arr[1]);die;
	
	//6.取出src中的图片,并保存到本地,即对$arr[1]进行遍历
	foreach($arr[1] as $v){
		$img_part_name = str_replace("http://img.a67.com","",$v);

		//7.连接到服务器(主机)网站
		$fp2 = fsockopen("img.a67.com",80,$error,$errstr,30);
		if(!$fp2){
			die("连接失败2 $error - $errstr");
		}
		
		$infos = pathinfo($img_part_name);
		
		//8.准备发送HTTP请求
		$httpstr2 = "GET $img_part_name HTTP/1.1\r\n";
		$httpstr2.= "Host: img.a67.com\r\n"; //这里的Host,后面三个字母要小写啊
		$httpstr2.= "Connection: Close\r\n\r\n";
		
		//echo $httpstr2; die;
		//9.发送HTTP请求
		fwrite($fp2,$httpstr2,strlen($httpstr2));
			
		//接收流,二进制的内容
		$img_str=""; 
		while(!feof($fp2)){
			$img_str.=fread($fp2,1024);
		}
		fclose($fp2); //关闭连接,关闭文件流,不关闭,会系统关闭
		
		$index = strpos($img_str,"\r\n\r\n");	
		$img_str = substr($img_str,$index+4);

		$path = "./myimages";
		if (!file_exists($path)){
			mkdir($path);
		}
		
		file_put_contents("{$path}/{$infos['basename']}",$img_str);
		
	}
	
	echo "采集成功";
	
?>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值