最简单的爬虫模型应该是这样的:给一个初始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
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn