最简单的爬虫模型应该是这样的:给一个初始url,爬虫把内容扒下拉,找页面里的url,在以这些url为起点,开始爬。
下面是一个最简单的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 = '/\'\"\ ]*).*?>/';
 
- $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