使用到:guzzle和dom-crawler
1、下载:composer require guzzlehttp/guzzle
2、下载:composer require symfony/dom-crawler
代码:
```php
<?php
require __DIR__.'/../../../vendor/autoload.php';
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;
function Spider()
{
//需要爬取的页面
//$url = 'https://movie.douban.com/subject/25812712/?from=showing';
$url = 'http://www.bwlc.net';
//下载网页内容
$client = new Client([
'timeout' => 10,
'headers' => ['User-Agent' => 'Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)',
],
]);
$response = $client->request('GET', $url)->getBody()->getContents();
//进行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选择器的方式
$pkq = $crawler->filterXPath('//div[contains(@class,"g_last")]//span')->text();
$data2 = $crawler->filterXPath('//div[contains(@class,"pk10_bg")]/ul/li')->each(function(Crawler $node , $i ) use (&$data){
$result = $node->text();
$data['shu'][] = $result;
});
$data['pkq'] = $pkq;
// //演员
// //本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;
}