上次看了韩顺平老师的自定义数据采集脚本视频,自己手痒了也想自己写一个玩玩,不料!就是这几十行的代码,我整整敲了一天才算完美过关,各种坑爹的事情不由分说,下面我来谈谈我深刻的体会!
因为是自己看着视频敲的,思路跟着视频走,但是还是很容易写错字符,或者错漏字符,当然了,我也没庆幸一遍就写完整(态度还是蛮好的),比如,在拼接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 "采集成功";
?>