最简单的爬虫模型应该是这样的:给一个初始url,爬虫把内容扒下拉,找页面里的url,在以这些url为起点,开始爬。
下面是一个最简单的php实现的爬虫模型。
-
<?php
-
/**
-
* 爬虫程序 -- 原型
-
*
-
* BookMoth 2009-02-21
-
*/
-
/**
-
* 从给定的url获取html内容
-
*
-
* @param string $url
-
* @return string
-
*/
-
function _getUrlContent($url){
-
$handle = fopen($url, "r");
-
if($handle){
-
$content = stream_get_contents($handle,1024*1024);
-
return $content;
-
}else{
-
return false;
-
}
-
}
-
/**
-
* 从html内容中筛选链接
-
*
-
* @param string $web_content
-
* @return array
-
*/
-
function _filterUrl($web_content){
-
$reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
-
$result = preg_match_all($reg_tag_a,$web_content,$match_result);
-
if($result){
-
return $match_result[1];
-
}
-
}
-
/**
-
* 修正相对路径
-
*
-
* @param string $base_url
-
* @param array $url_list
-
* @return array
-
*/
-
function _reviseUrl($base_url,$url_list){
-
$url_info = parse_url($base_url);
-
$base_url = $url_info["scheme"].'://';
-
if($url_info["user"]&&$url_info["pass"]){
-
$base_url .= $url_info["user"].":".$url_info["pass"]."@";
-
}
-
$base_url .= $url_info["host"];
-
if($url_info["port"]){
-
$base_url .= ":".$url_info["port"];
-
}
-
$base_url .= $url_info["path"];
-
print_r($base_url);
-
if(is_array($url_list)){
-
foreach ($url_list as $url_item) {
-
if(preg_match('/^http/',$url_item)){
-
//已经是完整的url
-
$result[] = $url_item;
-
}else {
-
//不完整的url
-
$real_url = $base_url.'/'.$url_item;
-
$result[] = $real_url;
-
}
-
}
-
return $result;
-
}else {
-
return;
-
}
-
}
-
/**
-
* 爬虫
-
*
-
* @param string $url
-
* @return array
-
*/
-
function crawler($url){
-
$content = _getUrlContent($url);
-
if($content){
-
$url_list = _reviseUrl($url,_filterUrl($content));
-
if($url_list){
-
return $url_list;
-
}else {
-
return ;
-
}
-
}else{
-
return ;
-
}
-
}
-
/**
-
* 测试用主程序
-
*
-
*/
-
function main(){
-
$current_url = "http://hao123.com/";//初始url
-
$fp_puts = fopen("url.txt","ab");//记录url列表
-
$fp_gets = fopen("url.txt","r");//保存url列表
-
do{
-
$result_url_arr = crawler($current_url);
-
if($result_url_arr){
-
foreach ($result_url_arr as $url) {
-
fputs($fp_puts,$url."\r\n");
-
}
-
}
-
}while ($current_url = fgets($fp_gets,1024));//不断获得url
-
}
-
main();
-
?>
当然这只爬虫还需要进行下面的进化才可以:
1、拼接更准确的url链接。现在的链接有可能是格式错误的。
2、能够去掉重复的url链接。现在的爬虫会做非常多非常多的重复工作。
3、避免爬虫怕成环路,一个永远右转的车,只能是300内环,它只会跑在三环路上,去不了别的地方。
4、多线程或者多进程。因为php没有线程的概念,所以可能需要shell这样的东西来模拟了。
5、……略去2的N次方个汉字。
反正是意思一下就好了~
from http://blog.csdn.net/bookmoth/archive/2009/02/21/3916538.aspx