//项目根目录
|-- 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