发送请求

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

创建 XCrawler 对象

一个完整的XCrawler对象是这样的,但并非所有参数都是必选的。

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    // 爬虫名称(必选,唯一,用于记录爬虫队列和日志。可以直接取命令的名称)
    'name' => NULL,
    // 并发线程数(可选,默认1)
    'concurrency' => 1,
    // 是否开启续爬(可选)
    'continue' => 0,
    // 爬取网页超时时间(可选)
    'timeout' => 10.0,
    // 每爬取多少页面记录一次日志(可选)
    'log_step' => 50,
    // 爬取根域名(可选)
    'base_uri' => '',
    // 每次爬取间隔时间(可选)
    'interval' => 0,
    // 队列长度,用于记录队列进度日志(可选)
    'queue_len' => NULL,
    // 失败重试次数(可选)
    'retry_count' => 5,
    // 需要发送的请求(必选)
    'requests' => function () {
        // do something
    },
    // 爬取成功的回调函数(必选)
    'success' => function ($result, $request, $xcrawler, $res_headers) {
        // do something
    },
    // 爬取失败的回调函数(可选)
    'error' => function ($request, $error_msg) {
        // do something
    },
]);
$xcrawler->run();

requests - 需要发送的请求

我们可以在请求闭包函数中,写出我们需要发起的请求。

最简单的一个示例是,我们发出一个get请求:

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'demo',
    // 需要发送的请求(必选)
    'requests' => function () {
        // 当请求内容为字符串时,会默认转为一个对此url的get请求。
        yield 'http://httpbin.org/';
    },
    ...
]);
$xcrawler->run();

发出多个get的请求

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'demo',
    // 开启10个线程进行请求
    'concurrency' => 10,
    // 需要发送的请求(必选)
    'requests' => function () {
        // 发出100个请求
        for ($i=0, $i<100, $i++) {
            yield 'http://httpbin.org/'.$i;
        }
    },
    ...
]);
$xcrawler->run();

注: 由于XCrawler的请求流程是,先把所有请求放入redis队列,再开始发送请求(为了实现断点续爬功能)。所以建议您不要一次性在requests参数发送过多的请求,如数10万及以上请求(具体上限取决于您的内存大小),建议分多次实例化XCrawler进行爬取。

发出post请求

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'demo',
    // 需要发送的请求(必选)
    'requests' => function () {
        $request = [
            'method' => 'post',
            'uri' => 'http://www.demo.com',
            'form_parmas' => [
                'foo' => 'xxx',
                'bar' => 'xxx',
            ],
        ];
        yield $request;
    },
    ...
]);
$xcrawler->run();

包含headers的请求

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'demo',
    // 需要发送的请求(必选)
    'requests' => function () {
        $request = [
            'method' => 'get',
            'uri' => 'http://www.demo.com',
            'headers' => [
                'user-agent' => 'xxx',
                'cookie' => 'xxx',
            ],
        ];
        yield $request;
    },
    ...
]);
$xcrawler->run();

请求选项

在请求中,除了headersform_params以外,还有很多其他的选项,例如bodyproxy等。

完整的请求选项,你可以参考: guzzle - 请求选项

所有其他的请求选项,你都可以追加在$request数组中。

success - 请求成功回调

一个请求成功回调函数是这样的:

use XCrawler\XCrawler;

$xcrawler = new XCrawler([
    'name' => 'demo',
    // 需要发送的请求(必选)
    'requests' => function () {
        yield 'http://www.demo.com';
    },
    'success' => function ($result, $request, $xcrawler, $res_headers) {
        // do something
    }
]);
$xcrawler->run();
  • $result 表示请求成功的结果,html或json之类的数据。
  • $request 表示发送的请求数据。例如上面的示例,会返回:
    [
        'method' => 'get',
        'uri' => 'http://www.demo.com',
    ];

    这在发送多个请求时非常有用,它可以让你知道本次成功的结果对应的是哪一个请求。

  • $xcrawler XCrawler对象。你可以通过该变量,执行一些操作。例如:

    use XCrawler\XCrawler;
    
    $xcrawler = new XCrawler([
        'name' => 'demo',
        // 需要发送的请求(必选)
        'requests' => function () {
            yield 'http://www.demo.com';
        },
        'success' => function ($result, $request, $xcrawler, $res_headers) {
            // 新增请求
            $xcrawler->addRequest('http://www.xxx.com');
            // 获取剩余爬取页数
            $xcrawler->getOverplus();
        }
    ]);
    $xcrawler->run();
  • $res_headers 请求响应头。你可以从$res_headers获取请求到的响应头信息

error - 请求失败回调函数

回调参数:

  • $request 失败的请求
  • $error_msg 失败原因