今天被安排做一下搜狐首页新闻部分抓
今天被安排做一下搜狐首页新闻部分抓取。本来很简单的事情,谁知到了搜狐页面抓过来的一直是乱码,怎么转都不行。只好深入研究了一下,也学到不少东西,写下来分享一下。
一、 什么是php采集程序?
二、 为什么要采集?
三、 采集些什么?
四、 如何采集?
五、 采集思路
六、 采集范例程序
七、 采集心得
什么是php采集程序?
php采集程序,也叫php小偷,主要是用于自动搜集网络上web页里特定内容,用php语言写的web程序,运行于支持php的平台上。谈到“自动搜集”,你可能联想到百度goole,联想到搜索引擎所做的事情。php采集程序,正是做类似的工作。
为什么要采集?
互联网正以飞快的速度在发展,web数据每天以几何级数据量递增,面对这庞大的数据,作为一个网站管理员的你,该如何搜集自己所需要的信息呢?特别对某个 或某几个同类网站,你需要它们的大量信息,来充实你的网站内容,难道就只能复制粘贴的过日子吗?一个网站管理员,你真的就得花大量时间去搞原创内容,而与整个互联网信息量的发展速度脱节吗?这些问题的解决方法只有一个:采集。如果有那么一个程序,你帮你的网站自动或半自动的采集你所需要的特定内容,即时更 新你网站的信息,是否是你梦寐以求的呢?这就是采集程序出现的原因所在。
采集些什么?
这要看你做的什么类型的网站了。如果你做图片站,就采集图片;做音乐站,就采集mp3,做新闻站,就采集新闻等等。一切根据你网站的内容架构需要而定。确定你要采集的东西,才好写出相应的采集程序。
如何采集?
通常采集程序,都是有的放矢的。也就是需要有目标网站,搜集一些你需要的采集内容的网站,分别对其html代码进行分析,找出规律性的东西,依据你要采集 的特定内容,写出php代码。采集到你要的东西以后,你可以选择自己需要的存放方式。比如直接生成html页面,或是放进数据库,作进一步处理或是存放成 特定的形式,以备后用。
采集思路
采集程序的思路很简单大体可以分为以下几个步骤:
1. 获取远程文件源代码(file_get_contents或用fopen).
2.分析代码得到自己想要的内容(这里用正则匹配,一般是得到分页)。
3.跟根得到的内容进行下载入库等操作。
在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。
array(
'method'=>get,
'header'=>accept-language: en\r\n .
cookie: foo=bar\r\n
)
);
$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);
/******方法二、 socket*******/
function get_content_by_socket($url, $host){
$fp = fsockopen($host, 80) or die(open . $url . failed);
$header = get /.$url . http/1.1\r\n;
$header .= accept: */*\r\n;
$header .= accept-language: zh-cn\r\n;
$header .= accept-encoding: gzip, deflate\r\n;
$header .= user-agent: mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; sv1; maxthon; infopath.1; .net clr 2.0.50727)\r\n;
$header .= host: . $host .\r\n;
$header .= connection: keep-alive\r\n;
//$header .= cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n;
$header .= connection: close\r\n\r\n;
fwrite($fp, $header);
while (!feof($fp)) {
$contents .= fgets($fp, 8192);
}
fclose($fp);
return $contents;
}
/******方法三、file_get_contents (),stream_context_create() 方法三********/
$opts = array(
'http'=>array(
'method'=>get,
'header'=>content-type: text/html; charset=utf-8
)
);
$context = stream_context_create($opts);
$file = file_get_contents('http://www.sohu.com/', false, $context);
/******方法四、 php的curl http://www.chinaz.com/program/2010/0119/104346.shtml*******/
$ch = curl_init();
// 2. 设置选项,包括url
curl_setopt($ch, curlopt_url, http://www.sohu.com);
curl_setopt($ch, curlopt_returntransfer, 1);
curl_setopt($ch, curlopt_header, 0);
curl_setopt($ch,curlopt_httpheader,array (content-type: text/xml; charset=utf-8,expect: 100-continue));
// 3. 执行并获取html文档内容
$output = curl_exec($ch);
var_dump($output);
// 4. 释放curl句柄
curl_close($ch);
/*注意
1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = on,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
2. 使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到c:/windows/system32下;linux下要安装curl扩展。
*/
?>
采集范例程序
/*一个图片下载函数*/
function getimg($url,$filename){
/*判断图片的url是否为空,如果为空停止函数*/
if($url==){
return false;
}
/*取得图片的扩展名,存入变量$ext中*/
$ext=strrchr($url,.);
/*判断是否是合法的图片文件*/
if($ext!=.gif && $ext!=.jpg){
return false;
}
/*读取图片*/
$img=file_get_contents($url);
/*打开指定的文件*/
$fp=@fopen($filename.$ext,a);
/*写入图片到指点的文件*/
fwrite($fp,$img);
/*关闭文件*/
fclose($fp);
/*返回图片的新文件名*/
return $filename.$ext;
}
采集图片php程序
view code
除了以上方法还可以用snoopy,也不错。
* 支持再转向的时候传递cookies (v0.92增加)