因为最近比较忙,所以距离第一篇的php爬虫已经相隔了比较远的时间了。最近终于解放了,时间也比较充足,而且环境上也不错,有稳定的网络可以使用,所以现在就把之前的坑再填一点吧。
在第一篇的时候写得比较随意,所以看起来会很乱。所以之后我就重构了代码,将所有的代码都进行了封装使用,这样子就不会太过于乱,也增加了代码重用的可能性了。
首先我们定义一些类变量,用来进行数据保存。
public $allUrl,//所有资源的url
$childUrl,//同一部资源的播放页面url
$data;//所有资源信息汇集的数组
private $_ch,//curl的存储变量
$myRegex;//正则规则
然后这个类的话,最重要的一部分就是curl的使用,所以这里面可以直接在初始化函数里面创建一个curl对象,而且这里面的话会涉及到非常多的连接,所以这个变量要到了程序结束之后,才被释放。
//构造函数
public function __construct(){
$this->_ch = curl_init();
// 设置URL和相应的选项
curl_setopt($this->_ch,CURLOPT_HEADER,0);//如果你想把一个头包含在输出中,设置这个选项为一个非零值。
curl_setopt($this->_ch,CURLOPT_RETURNTRANSFER,true);//将数据以字符串形式返回,而不是显示出来
}
//析构函数
function __destruct()
{
// TODO: Implement __destruct() method.
curl_close($this->_ch);
}
这里面还定义了一个去重函数封装在了类里面,因为我的操作都是写在类里面的,所以直接封装起来,使用起来会方便使用。这个函数主要是将二维转为一维数组再使用内置函数array_unique来进行去重,之后再使用explode来将一维数组转为二维数组。
//去重函数
function array_unique_my($arr){
//echo '<br/>进入去重函数处理<br/>';
foreach($arr as $v){
$v = join(',',$v);//降维,变为一维数组
$temp[] = $v;
}
$tmp = array_unique($temp);
unset($temp);
foreach($tmp as $v){
$v = explode(',',$v);//升维,变为二维数组
$temp[] = $v;
}
return $temp;
}
还有一堆基本的函数如下:
传一个正则数组进来:
//初始化正则表达式数组
public function initRegex($arr){
$this->myRegex = $arr;
}
设置一个爬取的页面然后返回一个html文件数据
//设置爬取的页面url
public function setTargetUrl($url){
curl_setopt($this->_ch,CURLOPT_URL,$url);
//var_dump("进入setTargetUrl函数");
$html = curl_exec($this->_ch);
return $html;
}
正则匹配我们所需要的内容函数
这里面记得要处理换行,回车,制表等符号。
//设置正则表达式
public function userRegex($rex,$str){
if(is_array($str)){
$str = serialize($str);
}
//预处理换行,回车,制表
$str = preg_replace("/[\t\n\r]+/","",$str);
preg_match_all($rex,$str,$aUrl,PREG_SET_ORDER);
// echo '正则匹配结果如下:<br/>';
// print_r($aUrl);
// echo '<br/>';
return $aUrl;
}
封装php原生的文件写入和文件读取的函数: