在做数据采集时经常要使用到curl+正则的方式采集需要的数据 根据自己的工作经验 把自己写的一些常用自定义函数 拿到博客园来分享 如果有写得不恰当的地方 请多多指教
这是一个系列 没办法在一两天写完 所以一篇一篇的发布
大致大纲:
1.curl数据采集系列之单页面采集函数get_html
2.curl数据采集系列之多页面并行采集函数get_htmls
3.curl数据采集系列之正则处理函数get _matches
4.curl数据采集系列之代码分离
5.curl数据采集系列之并行逻辑控制函数web_spider
、、、
单页面采集在数据采集过程中是最常用的一个功能 有时在服务器访问限制的情况下 只能使用这种采集方式 慢 但是可以简单的控制 所以写好一个常用的curl函数调用是很重要的
百度和网易比较熟悉 所以拿这两个网站首页采集来做例子讲解
最简单的写法:
2 $ch = curl_init($url);
3 curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
4 curl_setopt($ch,CURLOPT_TIMEOUT,5);
5 $html = curl_exec($ch);
6 if($html !== false){
7 echo $html;
8 }
由于使用频繁 可以利用curl_setopt_array写成函数的形式:
2 $options[CURLOPT_RETURNTRANSFER] = true;
3 $options[CURLOPT_TIMEOUT] = 5;
4 $ch = curl_init($url);
5 curl_setopt_array($ch,$options);
6 $html = curl_exec($ch);
7 curl_close($ch);
8 if($html === false){
9 return false;
10 }
11 return $html;
12 }
2 echo get_html($url);
有时候需要传递一些特定的参数才能得到正确的页面 如现在要得到网易的页面:
2 echo get_html($url);
会看到一片空白 什么也没有 那么再利用curl_getinfo写一个函数 看看发生了什么:
2 $options[CURLOPT_RETURNTRANSFER] = true;
3 $options[CURLOPT_TIMEOUT] = 5;
4 $ch = curl_init($url);
5 curl_setopt_array($ch,$options);
6 $html = curl_exec($ch);
7 $info = curl_getinfo($ch);
8 curl_close($ch);
9 return $info;
10 }
11 $url = 'http://www.163.com';
12 var_dump(get_info($url));
可以看到http_code 302 重定向了 这时候就需要传递一些参数了:
2 $options[CURLOPT_FOLLOWLOCATION] = true;
3 echo get_html($url,$options);
会发现 怎么是这样的一个页面 和我们电脑访问的不同???
看来参数还是不够 不够服务器判断我们的客户端是什么设备上的 就返回了个普通版
看来还要传送USERAGENT
get_defined_vars()
返回由所有已定义变量所组成的数组
get_defined_constants()
返回由所有已定义常量所组成的数组
get_defined_functions ()
获得所有已定义的函数
get_loaded_extensions()
获得所有可用的模块
get_extension_funcs(string $module_name)
获取指定模块的可用函数
get_declared_classes()
获取由已定义类的名字所组成的数组
本文链接
在类中自定义构造方法的基本语法:
//php5这样[修饰符]function __construct([参数列表]){
}
//php4 这样[修饰符]function 类名([参数列表]){
}
看个列子就很好理解了:
class Person{
public $name;
public $age;
//构造方法 php5
public function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
//构造方法 php4 写在这里是php5为了兼容PHP4
public function Person($name,$age){
$this->name=$name;
$this->age=$age;
}
}
$p1=new Person("老大",27);
echo $p1->name;
$p1=new Person("小二",26);
$p1=new Person("小三",24);
?>
注意地方:
$this 的理解:
1、$this 本质可以理解就是这个对象的地址
2. 哪个对象使用到$this, 就是哪个对象地址
- 构造方法名和类名相同(php4版),php5版的构造方法名可以和类名相同,也可以是__construct()
- 构造方法的默认访问修饰符是public,同时构造方法没有返回值
- 创建新对象成功后,系统自动的调用该类的构造方法
- 一个类有且只有一个构造方法,在php5后虽然__construct() 和 类名() 可以共存,但是实际上也只能使用一个。
- 如果没有给类自定义构造方法,则该类使用系统默认的构造方法。
- 如果给类自定义了构造方法,则该类的默认构造方法被覆盖。
本文链接