什么叫采集?
就是使用PHP程序,把其余网站中的信息抓取到咱们本身的数据库中、网站中。php
PHP制做采集的技术:html
从底层的socket到高层的文件操做函数,一共有3种方法能够实现采集。数据库
1. 使用socket技术采集:编程
socket采集是最底层的,它只是创建了一个长链接,而后咱们要本身构造http协议字符串去发送请求。数组
例如要想获取这个页面的内容,http://tv.youku.com/?spm=a2hww.20023042.topNav.5~1~3!2~A,用socket写以下:浏览器
- <?php
- $fp=fsockopen("www.youku.com",80,$errno,$errstr,30);
- if(!$fp) die("链接失败".$errstr);
-
- $http="GET /?spm=a2hww.20023042.topNav.5~1~3!2~A HTTP/1.1\r\n";
- $http.="Host:www.youku.com\r\n";
- $http.="Connection:close\r\n\r\n";
-
- fwrite($fp,$http,strlen($http));
- $data='';
- while (!feof($fp)) {
- $data.=fread($fp,4096);
- }
- fclose($fp);
- var_dump($data);
- ?>
打印出的结果以下,包含了返回的头信息及页面的源码:服务器

2. 使用curl_一套函数网络
curl把HTTP协议都封装成了不少函数,直接传相应参数便可,下降了编写HTTP协议字符串的难度。curl
前提:在php.ini中要开启curl扩展。socket
- $curl=curl_init();
- curl_setopt($curl, CURLOPT_URL, "http://www.youku.com");
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- $data=curl_exec($curl);
- var_dump($data);
打印出的结果以下,只包含页面的源码:

3. 直接使用file_get_contents(最顶层的)
前提:在php.ini中设置容许打开一个网络的url地址。

- $data=file_get_contents("http://www.youku.com");
- var_dump($data);

3种方式的选择
网络之间通讯主要使用的是以上三种。其中后两种用的较多:若是要批量采集大量的数据时使用第二种【CURL】,性能好、稳定。
偶尔发几个请求发的频繁不密集时使用第三种。
扩展:图片的防盗链如何破?
好比7060网站上的图片作了防盗链:在他的网站中能够看到图片,把图片拿到站外就没法访问。

原理:在HTTP协议中有一个referer项,表明发这个请求的来源地址,服务器会判断若是这个请求不是这个网站发来的就会过滤掉这个请求:

解决办法:发HTTP时本身模拟referer便可:

扩展:有些要采集数据时时必须先登陆,能够使用模拟的试模拟在登陆状态下的采集:
a. 先用浏览登陆一下,登陆完,浏览器的COOKIE中就会有SESSIONID
b. 发PHP发HTTP协议时,把浏览器中的SESSIONID放到PHP的HTTP协议请求里,这样就在以登陆的状态发请求。
总结:全部客户端发过来的数据均可以被模拟,因此服务器上的程序必需要必要的地方过滤客户端的数据。
何时用以上东西?接口开发时、采集时。
2、数据采集
例如我要采集这个url里的全部美国电影的信息,
http://list.youku.com/category/show/c_96_a_%E7%BE%8E%E5%9B%BD_s_1_d_1_p_3.html
则先要知道电影所在的节点的结构,咱们使用firebug查看。

而后开始写代码:完整代码以下
- function get($url)
- {
- global $curl;
-
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($curl, CURLOPT_HEADER, FALSE);
-
- return curl_exec($curl);
- }
-
- $curl = curl_init();
- $url='http://list.youku.com/category/show/c_96_a_%E7%BE%8E%E5%9B%BD_s_1_d_1_p_3.html';
- $data=get($url);
- $list_preg = '/<li class="yk-col4 mr1">.+<\/li>/Us';
- $img_preg = '/<img class="quic" _src="(.*)" src="(.*)" alt="(.*)" \/>/U';
- $video_preg='/<a href="(.*)" title="(.*)" target="(.*)"><\/a>/U';
- preg_match_all($list_preg,$data,$list);
-
- foreach ($list[0] as $k => $v) {
-
- preg_match($img_preg,$v,$img);
- preg_match($video_preg,$v,$video);
- echo $img[0].'<a href="'.$video[1].'">'.$video[2].'</a>';
- }
测试:
打印$list;

打印$img

打印$video

最终效果:

若是须要把图片拷贝到硬盘上,则在foreach循环里加上如下代码:
- $imgData = get($img[1]);
-
-
- is_dir('./youkuimg/') ? '': mkdir('./youkuimg/');
- file_put_contents('./youkuimg/'.mb_convert_encoding($img[3], 'gbk', 'utf-8').'.jpg', $imgData);

效果以下:在当前目录下的youkuimg目录下就会有下载好的图片。
