使用DomCrawler抓取页面

注:需提前安装好composer管理工具

1.composer下载dom-crawler
cmd进入命令行,进入php环境目录,输入以下命令

composer require symfony/dom-crawler

2.新建test.php,代码如下

<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\DomCrawler\Crawler;

print_r(json_encode(Spider(), JSON_UNESCAPED_UNICODE));

function Spider()
{
    //需要爬取的页面
    $url = 'https://movie.douban.com/subject/25812712/?from=showing';

    $response = file_get_contents($url);
    //进行XPath页面数据抽取
    $data    = []; //结构化数据存本数组
    $crawler = new Crawler();
    $crawler->addHtmlContent($response);

    try {
        //电影名称
        //网页结构中用css选择器用id的比较容易写xpath表达式
        $data['name'] = $crawler->filterXPath('//*[@id="content"]/h1/span[1]')->text();
        //电影海报
        $data['cover'] = $crawler->filterXPath('//*[@id="mainpic"]/a/img/@src')->text();
        //导演
        $data['director'] = $crawler->filterXPath('//*[@id="info"]/span[1]/span[2]')->text();
        //多个导演处理成数组
        $data['director'] = explode('/', $data['director']);
        //过滤前后空格
        $data['director'] = array_map('trim', $data['director']);

        //编剧
        $data['cover'] = $crawler->filterXPath('//*[@id="info"]/span[2]/span[2]/a')->text();
        //主演
        $data['mactor'] = $crawler->filterXPath('//*[@id="info"]/span[contains(@class,"actor")]/span[contains(@class,"attrs")]')->text();
        //多个主演处理成数组
        $data['mactor'] = explode('/', $data['mactor']);
        //过滤前后空格
        $data['mactor'] = array_map('trim', $data['mactor']);

        //上映日期
        $data['rdate'] = $crawler->filterXPath('//*[@id="info"]')->text();
        //使用正则进行抽取
        preg_match_all("/(\d{4})-(\d{2})-(\d{2})\(.*?\)/", $data['rdate'], $rdate); //2017-07-07(中国大陆) / 2017-06-14(安锡动画电影节) / 2017-06-30(美国)
        $data['rdate'] = $rdate[0];
        //简介
        //演示使用class选择器的方式
        $data['introduction'] = trim($crawler->filterXPath('//div[contains(@class,"indent")]/span')->text());

        //演员
        //本xpath表达式会得到多个对象结果,用each方法进行遍历
        //each是传入的参数是一个闭包,在闭包中使用外部的变量使用use方法,并使用变量指针
        $crawler->filterXPath('//ul[contains(@class,"celebrities-list from-subject")]/li')->each(function (Crawler $node, $i) use (&$data) {
            $actor['name']   = $node->filterXPath('//div[contains(@class,"info")]/span[contains(@class,"name")]/a')->text(); //名字
            $actor['role']   = $node->filterXPath('//div[contains(@class,"info")]/span[contains(@class,"role")]')->text(); //角色
            $actor['avatar'] = $node->filterXPath('//a/div[contains(@class,"avatar")]/@style')->text(); //头像
            //background-image: url(https://img3.doubanio.com/img/celebrity/medium/5253.jpg) 正则抽取头像图片
            preg_match_all("/((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+\.(jpg|jpeg|gif|png)/", $actor['avatar'], $avatar);
            $actor['avatar'] = $avatar[0][0];
            //print_r($actor);
            $data['actor'][] = $actor;
        });

    } catch (\Exception $e) {

    }

    return $data;

}

3.执行结果为json字符串,如下

{“name”:”神偷奶爸3 Despicable Me 3”,”cover”:”辛科·保罗”,”director”:[“凯尔·巴尔达”,”皮埃尔·柯芬”,”埃里克·吉隆”],”mactor”:[“史蒂夫·卡瑞尔”,”克里斯汀·韦格”,”崔·帕克”,”米兰达·卡斯格拉夫”,”达纳·盖尔”,”内芙·沙雷尔”,”皮埃尔·柯芬”,”史蒂夫·库根”,”朱莉·安德鲁斯”,”珍妮·斯蕾特”,”迈克尔·贝亚蒂”,”安迪·尼曼”,”阿德里安·奇斯卡托”,”布莱恩·T·德莱尼”,”肯·道里欧”],”rdate”:[“2017-07-07(中国大陆)”,”2017-06-14(安锡动画电影节)”,”2017-06-30(美国)”],”introduction”:”  洗心革面之后,格鲁(史蒂夫·卡瑞尔 Steve Carell 配音)作为特工成绩斐然,却因未能打败坏小子巴萨扎·布莱德(崔·帕克Trey Parker 配音)而被新局长扫地出门。就在此时,他收到一封远方来信,这才得知自己原来还有一个双胞胎兄弟德鲁(史蒂夫·卡瑞尔 Steve Carell 配音)。在德鲁盛情邀请下,格鲁带着妻子露西•王尔德(克里斯汀·韦格 Kristen Wiig 配音)以及玛戈(米兰达·卡斯格拉夫 Miranda Cosgrove 配音)、伊迪丝(达娜·盖伊 Dana Gaier 配音)和阿格蕾丝(埃尔希·费舍 Elsie Fisher 配音)来到了他亲生父亲所居住的地方探亲。德鲁天真烂漫,却一心想和哥哥搭档成为坏蛋二人组。格鲁虽然暂时回归狂野,可正义之心并未泯灭。\n \n   尤其当巴萨扎邪恶的计划和三个可爱的孩子牵扯到一起时,他再也无法坐视…\n \n (展开全部)”,”actor”:[{“name”:”皮埃尔·柯芬 “,”role”:”导演”,”avatar”:”https:\/\/img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p1389806916.36.jpg”},{“name”:”凯尔·巴尔达 “,”role”:”导演”,”avatar”:”https:\/\/img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p51602.jpg”},{“name”:”史蒂夫·卡瑞尔 “,”role”:”饰 格鲁 \/ 德鲁 Gru \/ Dru”,”avatar”:”https:\/\/img3.doubanio.com\/view\/celebrity\/s_ratio_celebrity\/public\/p15731.jpg”}]}

总结
1.最好使用composer下载,否则有很多包含,关联会报错
2.原理使用的xpath,语法有很多,后期可扩展相关知识,完成其他更具体任务

猜你喜欢

转载自blog.csdn.net/andysongjinqiang/article/details/80018604