第一个示例

注: 安装包已包含此示例代码。此文档帮助你更好的了解各个步骤的含义。

选择一个网站

电影天堂为例,我们想要获取“2018新片精品”板块中的影片名称、URL以及发布时间。

首先,我们在项目根目录创建一个文件: demo.php

创建爬虫请求

通过创建一个XCrawler对象来发送请求。

<?php
require 'vendor/autoload.php';

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'dytt8:index',
    'requests' => function() {
        $url = 'http://www.dytt8.net/';
        yield $url;
    },
    'success' => function($result, $request, $xcrawler) {
        echo $result;
    }
]);
$xcrawler->run();

如上所示:name参数是唯一的,用于记录日志和爬虫队列,requests闭包函数中定义需要发送的请求。而success方法则是请求成功的回调方法。

解析数据

现在我们已经可以获取到网页的html数据了,接下来我们需要把从html中提取出我们想要的数据。

这里我们需要用到symfony的DomCrawler包。(XCrawler项目默认已引入)

<?php
require 'vendor/autoload.php';

use XCrawler\XCrawler;
use Symfony\Component\DomCrawler\Crawler;

$xcrawler = new XCrawler([
    'name' => 'dytt8:index',
    'requests' => function() {
        $url = 'http://www.dytt8.net/';
        yield $url;
    },
    'success' => function($result, $request, $xcrawler) {
        // 把html的编码从gbk转为utf-8
        $result = iconv('GBK', 'UTF-8', $result);
        $crawler = new Crawler();
        $crawler->addHtmlContent($result);

        $list = [];
        // 通过css选择器遍历影片列表
        $tr_selector = '#header > div > div.bd2 > div.bd3 > div:nth-child(2) > div:nth-child(1) > div > div:nth-child(2) > div.co_content8 tr';
        $crawler->filter($tr_selector)->each(function (Crawler $node, $i) use (&$list) {
            $name = dom_filter($node, 'a:nth-child(2)', 'html');
            if (empty($name)) {
                return;
            }
            $url = 'http://www.dytt8.net'.dom_filter($node, 'a:nth-child(2)', 'attr', 'href');

            $data = [
                'name' => $name,
                'url' => $url,
                'time' => dom_filter($node, '.inddline font', 'html'),
            ];
            // 把影片url、name推送到redis队列,以便进一步爬取影片下载链接
            redis()->lpush('dytt8:detail_queue', json_encode($data));
            $list[] = $data;
        });
        var_dump($list);
    }
]);
$xcrawler->run();

执行爬虫命令

直到这一步,一个爬虫就已经创建完成了。

现在,我们可以运行自己的爬虫。在自己的项目根目录执行

php demo.php

输出

array(15) {
  [0] =>
  array(3) {
    'name' =>
    string(55) "2018年喜剧《比得兔/彼得兔》BD中英双字幕"
    'url' =>
    string(55) "http://www.dytt8.net/html/gndy/dyzz/20180419/56728.html"
    'time' =>
    string(10) "2018-04-19"
  }
  [1] =>
  array(3) {
    'name' =>
    string(57) "2018年纪录片《厉害了,我的国》HD国语中字"
    'url' =>
    string(55) "http://www.dytt8.net/html/gndy/dyzz/20180419/56727.html"
    'time' =>
    string(10) "2018-04-19"
  }
  ...