使用正则表达式爬取电影天堂电影

   先祭奠一下逝去的6级考试,临考准考证丢失5555555....索性就不考了,学习下的正则表达式吧

最初,只是简单的测试,但运行效率低下,获取数量十分的少,后稍加改良,
可以一次性抓取到8个分类下的近300个电影(没有考虑分页的问题),以后有机会再优化吧。

原文地址http://blog.csdn.net/ty_hf/article/details/46484065
<?php



    function getMovies(){
            $date = "20150610";
            $i = 0;
            $num = 48276;
            while($num <= 48286){
                //获取页面
                $orgin = file_get_contents("http://www.ygdy8.net/html/gndy/dyzz/".$date."/".$num.".html");
                if(strlen($orgin) > 10000){
                //获取电影名称
                    preg_match_all('/[a-z]+=#[\da]+>(.*?)<\/font><\/h1><\/div>/',$orgin, $movie_name);
                //获取电影链接
                    preg_match_all("/<a\s*.*>.*?<\/a>/",$orgin, $movie_link);
                //整理存入数组
                    $arr[$i]["name"] = $movie_name[1][0];
                    $arr[$i]["link"] = $movie_link[0][68];
                    $i +=1;            //进入下一个数组
                }
                $num +=1;
            }
            echo "<pre>";
            print_r ($arr);
            echo "</pre>";
    }
    getMovies();

存在问题:
1.页面链接的规律没找出:找到年月日与电影id的范围的关系,可以把它动态化,实现用户输入日期,搜索出当天的电影
2.时间缓存问题
1) 正则写的不是很完善,不精确导致时间缓慢,数据冗余
2) 算法方面问题待优化
3.漏洞,在数组获取链接时的问题,即电影链接不是第68个 $movie_link[0][68]; 就出糗了

待提高中……
吃饭去!!

使用正则表达式爬取电影天堂电影_第1张图片
日期输入20150610,显示0610当天的电影

日期输入20150611,显示0611当天的电影

<?php define("MOVIES_DIR","movies/"); $data = file_get_contents("http://www.dytt8.net/"); //获取一级页面 $model_one = "/<li>\s*<a href=\"(.*?)\">(.*?)<\/a>/U"; preg_match_all($model_one,$data,$menusList); //匹配出所要的分类名称级链接 $menusList['url'] = $menusList[1]; //提取链接 $menusList['name'] = $menusList[2]; //提取名称 for($i=0 ;$i<8; $i++){ //页面中有八个分类符合下边年正则的规则,循环8次 $movies_path=MOVIES_DIR.$menusList['name'][$i]; // 目录不存在创建目录 if(!is_dir($movies_path)){ mkdir($movies_path,0700,true); //因为设计到多层文件夹,所以打开递归true } $base_url = $menusList['url'][$i]; //上边获取的URL是相对路径 $data = file_get_contents($base_url); //获取二级页面代码 $model_two = "/<b>.*<a href=\"(.*)\"/sU"; // $model_two = "/<b>.*<a href=\"(.*?)\"/s";//和上边比较???????????????????????????????????  preg_match_all($model_two,$data,$moviesList); //得到三级页面地址 foreach ($moviesList['1'] as $moviesList) { $base_url = "http://www.ygdy8.net".$moviesList; //上边获取的URL是相对路径,补全它 $data = file_get_contents($base_url); //获取三级页面代码 // 获取电影名称 $model_three_name = "/#07519a>(.*?)<\/font>/"; preg_match($model_three_name,$data,$movie); $movies["name"] = $movie[1]; // print_r($movies['name']);exit; //测试成功 // 获取电影链接 $model_three_url = "/#fdfddf\"><a href=\"(.*?)\">/"; preg_match($model_three_url,$data,$movie); $movies["url"] = $movie[1]; // print_r($movies['url']);exit; //测试成功 // 获取电影简介 $model_three_intro = "/<br \/><br \/>◎(.*?)<br \/><br \/>/"; preg_match($model_three_intro,$data,$movie); @$movies["intro"] = $movie[1]; //因为有的页面没有此项或搜索错误+@ // print_r($movies['intro']);exit; //测试成功 // 获取电影图片 $model_three_pic = "/<p><br \/><img border=\"0\" src=\"(.*?)\" alt=/"; preg_match($model_three_pic,$data,$movie); @$movies["pic"] = $movie['1']; //因为有的页面没有此项或搜索错误+@ // print_r($movie);exit; // 数据获取完成,进行数据存储 $result=""; foreach ($movies as $key => $value) { $result .="电影".$key."是:".$value."\r\n"; } // print_r($movies);exit; //测试成功 @file_put_contents($movies_path."/".$movies["name"].".txt", $result); } } ?>

你可能感兴趣的:(正则-爬虫)