## 分页列表采集 下面我们以采集站长之家的列表页为例:[http://www.chinaz.com/biz/info/1.shtml](http://www.chinaz.com/biz/info/1.shtml) ## 1. 基本信息 基本信息配置很简单,按照表单备注提示填写即可。 ![](https://box.kancloud.cn/be4bd9e367693ace7a19e9e46c06ca39_1492x1170.png) >[info] 目标编码:用谷歌浏览器打开你要采集的网址,点击右键-审查元素,查看网页源码。如下图: ![](https://box.kancloud.cn/27f2cf15298b9170a48bdbbb3aeeadfb_1682x970.png) >[info] 网址类型: 分页列表:采集有规则的分页数据。 固定网址:采集固定的某个或多个页面。 >[info] 列表首页:部分网站的列表开始页是index或其他命名规则,有效页码数是从2开始的时候,此处为必填项。 >[info] 链接前缀:指列表页里面的内容链接不是全路径时,例:/detail/124.html,类似这样的链接的时候,此处为必填。 >[info] 资源前缀:指图片或文件的访问地址不是全路径时,例:/upload/img/123.png,类似这样的地址的时候,此处为必填。 ## 2. 列表页规则 >[info] 基本信息里面的网址类型设置为分页列表时必须配置列表页规则,如果为固定网址时,请忽略列表页规则的配置。 ![](https://box.kancloud.cn/eafd5e92ae2090dbe05f56cdbc2a7c73_1912x436.png) > 标题:顾名思义,就是字段对应的标题 > 字段名:指数据库对应的字段名,如需入库,必须与真实的数据库字段同名 > 选择器:即我们要采集的CSS选择器,例如:.post-title>a > 属性:即我们要采集的CSS选择器绑定的属性。纯文字填写:text,含html标签填写:html,其他属性自行选择,如a标签的href属性则填写:href >固定值:指当前字段无需通过采集获取,需要固定为某个值,这时前面的选择器、属性、内容过滤均可不填 >内容过滤:采集的目标内容里面,有些数据是我们不需要的,我们可以用选择器的方式来过滤这些内容 >入库:指当前采集的字段是否需要存入数据库 > 列表:指是否需要在采集内容管理页面显示 > 下载:指当前字段如果为图片或其他文件时,是否需要下载到本地服务器 >[warning] 列表页规则默认创建了一个详情链接规则,此规则不填写将无法正常抓取到完整的内容页面。我们以采集站长之家的列表页为例: ![](https://box.kancloud.cn/35548ebedbacc67d3e2e8aead000aaf4_2220x992.png) ***** 正确的规则如下: ***** ![](https://box.kancloud.cn/8be0af292e0bb47e604fb8c26670acbf_1872x302.png) ***** 如果还需要采集其他字段信息(如:文章标题),点击右侧蓝色的加号。 ***** ![](https://box.kancloud.cn/2473b2529391ce6caf17014560f3d04f_1886x942.png) ***** 正确的规则如下: ***** ![](https://box.kancloud.cn/6bacb608be99c471bdcdd21a0b38728d_1926x424.png) ## 内容页规则 >[info] 内容页规则含义同上。我们以采集此链接为例:[http://www.chinaz.com/2019/0613/1023717.shtml](http://www.chinaz.com/2019/0613/1023717.shtml) ## 需求1:采集文章来源 ![](https://box.kancloud.cn/950aa037bd15bdc4dc9814bcd3877be8_2178x1052.png) ***** 通过浏览器审查元素找到了文章来源被包含在class名为source的span标签里面,而且里面还嵌套了一个a标签。那我们的采集规则就变得很简单了,用css选择器的写法就是:`.source>a`,我们需要采集的是A标签包含的文字信息,所以我们的属性直接填写`text`即可。如下图: ![](https://box.kancloud.cn/288a84d153caa37c518277376d6fe73f_1998x272.png) ## 需求2:采集文章内容 ![](https://box.kancloud.cn/bb27fcb34e40d8e261b44e64846646fc_2238x1390.png) ***** 我们通过审查元素,找到文章的内容被包含在一个class为detail的div标签里面。采集规则的选择器就特别简单了,直接填写`.detail`即可。文章的内容包含有很多的排版,排版里面是含有html标签的,所以我们的采集属性需要填写`html`。如下图: ![](https://box.kancloud.cn/fff7f961a25afc305126368e20a8eb28_2102x424.png) >[info] 细心的小伙伴可能已经发现了内容页规则多了一个分页选项,有些网站的文章内容比较长([http://www.chinaz.com/manage/2019/0428/1012578.shtml](http://www.chinaz.com/manage/2019/0428/1012578.shtml)),使用了内容分页,如果希望采集到完整的内容,我们就需要勾选上分页选项。 ## 3. 高级配置 ![](https://box.kancloud.cn/f86ac2c57e51b9954acff08e385a5d4a_1824x644.png) ***** >[info] 内容分页就是上面讲的文章内容分页,依然用CSS选择器的方式提取分页代码。 ![](https://box.kancloud.cn/804c0ce1905ba4064db0b4f368c19478_1596x724.png) ***** 我们看到分页代码被class名为pagebreak的div标签包裹起来了。选择器名填写`.pagebreak>a`即可。属性保持默认值 `href` 即可。编辑器根据自己实际的使用情况选择,选择编辑器主要是为了自动转换不同编辑器的分页标记。 ![](https://box.kancloud.cn/527c34405f5cd5749626e74445b6a975_1906x622.png) >[info] 回调方法:为了方便您对接不同业务模块的采集需求,数据采集完成后会根据你自定义的入库字段,生成一个新的数据结构并推送到你指定的回调方法里面。你可以根据自己的需求对采集的数据做二次处理并入库。 ``` <?php namespace app\blog\admin; use app\system\admin\Admin; use app\blog\model\BlogArticle as ArticleModel; /** * 文章控制器 * @package app\blog\admin */ class Article extends Admin { /** * 采集插件接口示例 * @param array $data 采集的数据集 * @return number/string */ public function collect($data) { // 数据验证 $result = $this->validate($data, 'app\blog\validate\Article'); if ($result !== true) { return $result; } // 入库 $model = new ArticleModel; if ($model->save($data) === false) { return $model->getError() ? $model->getError() : '入库保存失败'; } // 必须返回新增主键ID return $model->id; } } ``` >[danger] 特别说明:回调方法必须在后台控制器(admin)目录下面。