自制爬虫框架-Pider框架快速开始

  • 快速使用
    • 项目的基本结构
    • 运行
    • 爬虫
    • 数据处理
    • 示例
    • 基本用法
    • 响应处理
    • 多进程

快速使用

项目的基本结构

//项目根目录
|-- Config  //配置文件
|-- LICENSE
|-- README.md
|-- composer.json
|-- composer.lock
|-- examples //示例
|-- install.sh //安装脚本
|-- pider -> src/bin/pider //爬虫管理命令工具
|-- piderd -> src/bin/piderd //爬虫分布式管理工具
|-- src  //源码

运行

爬虫
./pider  spidername.php(你创建的爬虫实例)

数据处理
./pider --digest digestname.php(你创建的数据处理实例)

示例
  • 创建实例
mkdir spiders //创建爬虫文件夹,里面放置你写的爬虫实例
mkdir digests //创建数据处理文件夹,里面放置你写的数据处理实例
touch spiders/TestSpider.php
touch digests/TestDigest.php
  • 编写实例
//TestSpider.php

use Pider\Spider;
use Pider\Http\Response;
class TestSpider extends Spider {
     protected $start_urls = ['https://item.jd.com/1304924.html'];
     protected $domain     = ['www.jd.com'];

     public function parse(Response $response) {
          echo "Hello Pider!".PHP_EOL;
    }
}
//TestDigest.php

use Pider\Digest;
class TestDigest extends Digest {
     protected $start_urls = ['https://item.jd.com/1304924.html'];
     protected $domain     = ['www.jd.com'];

     public function process(Response $response) {
          echo "Hello Digest!".PHP_EOL;
    }
}
  • 运行实例
./pider spiders/TestSpider.php
./pider digests/TestDigest.php

注意:

定义的实例类名必须和文件名一致

基本用法

     爬虫中最常见的场景就是,请求一个 html 页面,或者返回 json/xml 格式的接口, 然后处理响应文本。

use Pider\Spider;
use Pider\Http\Response;
class BasicSpider extends Spider {
     protected $start_urls = ['https://item.jd.com/1304924.html'];
     protected $domain     = ['www.jd.com'];

     public function parse(Response $response) {
      //获取商品名称
      $name = $response->xpath('//div[contains(@class,"itemInfo-wrap")]/div[contains(@class,"sku-name")]/text()')->extract(); 
      //打印商品名称
      var_dump($name);
     }
}

Note: 该例子中的 parse() 方法是用来解析响应请求, $start_urls 是用来设定请求的 urls 。你也可以通过 start_requests() 来设定请求的 urls 。但是需要注意的是, start_requests()$start_urls 两种方法只能单独使用。

响应处理

     爬虫的目的是从抓取到的 html 或者 json/xml 页面中分析到有用的信息。 Pider 提供了方便 的 回调机制 来从响应中提取有用的信息。默认的回调函数为 parse() (在未给指定的 Request 指定回调函数的情况下)。~Pider~ 也允许在 创建 Request 对象的时候,自定义回调函数。如下:

use Pider\Spider;
use Pider\Http\Response;
use Pider\Http\Request;

class CustomizedCallbackSpider extends Spider {

     protected $start_urls = ['https://item.jd.com/1304924.html'];
     protected $domain     = ['www.jd.com'];

     public function parse(Response $response) {
      //获取商品名称
      $name = $response->xpath('//div[contains(@class,"itemInfo-wrap")]/div[contains(@class,"sku-name")]/text()')->extract(); 
      //打印商品名称
      var_dump($name);
      //发起新的请求
      return (new Request(['base_uri'=>'https://item.jd.com/1304924.html',[$this,'']]));
     }

     public function parse2(Response $response) {
     //自定义回调
     echo "Customized callback".PHP_EOL;
     }
}

多进程

     对于爬虫程序来说,大多数的时间都耗费在网络请求上面。当我们需要爬取大量的页面的时候,我们就不得不 考虑爬虫性能的问题, Pider 框架支持多进程爬虫,利用计算机的多核CPU,来提升大量爬取时候的爬虫性能。

use Pider\Spider;
use Pider\Http\Response;
class MultiSpider extends Spider {
    protected $domains = [ 'www.jd.com' ];
    protected $processes = 4;
    protected $start_urls = [
    'https://item.jd.com/1378700118.html',
    'https://item.jd.com/302813.html',
    'https://item.jd.com/1304924.html',
    'https://item.jd.com/2286746.html'
    ];
    protected $count = 1;
    public function parse(Response $response) {
       //获取商品名称
      $name = $response->xpath('//div[contains(@class,"itemInfo-wrap")]/div[contains(@class,"sku-name")]/text()')->extract(); 
      var_dump($name);
      $this->count++;
    }
}

如果你对本项目感兴趣, 或者觉得对你有用,可以在给项目一个star或者watch, 项目地址:https://github.com/duanqiaobb/pider

你可能感兴趣的:(php,工具,爬虫,网络爬虫)