注:需提前安装好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,语法有很多,后期可扩展相关知识,完成其他更具体任务