ThinkPHP定时爬虫核心是三件事:用QueryList抓取数据、用Db或模型写入数据库、通过系统定时任务(如crontab)触发脚本;需封装Crawler类、创建命令行指令、配置系统级定时任务,并做好防爬与日志记录。

ThinkPHP 中做定时爬虫,核心是三件事:用 QueryList 抓取网页数据、用 ThinkPHP 的模型或 Db 类写入数据库、通过系统定时任务(如 Linux crontab 或 Windows 任务计划)定期触发爬取脚本。不依赖第三方调度服务,轻量可控。
一、安装 QueryList 并封装爬虫类
推荐使用 Composer 安装 QueryList(以 v4 为例,兼容 TP5/6):
composer require jaeger/querylist在 app/common 下新建 Crawler.php,封装通用采集逻辑:
- 支持设置 User-Agent、超时、重试,避免被封
- 用
QueryList::get()或QueryList::post()请求目标页 - 用
find()->texts()或find()->map()提取结构化数据 - 返回标准数组,便于后续处理
示例(采集某新闻列表标题和链接):
立即学习“PHP免费学习笔记(深入)”;
use QL\QueryList;class Crawler {
public static function fetchNewsList() {
$ql = QueryList::get('https://example.com/news', [], [
'timeout' => 10,
'headers' => ['User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)']
]);
return $ql->find('div.news-item h2 a')->map(function ($a) {
return [
'title' => $a->text(),
'url' => $a->attr('href')
];
})->all();
}
}
二、创建命令行指令(TP5/6 均适用)
用 ThinkPHP 的命令行功能,把爬虫包装成可调度的指令,比直接写 PHP 脚本更规范、易维护。
- TP5:运行
php think make:command SpiderNews - TP6:运行
php think make:command SpiderNews - 编辑生成的 app/command/SpiderNews.php
- 在
execute()方法中调用Crawler::fetchNewsList(),再批量入库
入库建议用 Db::name('news')->insertAll($data) 或模型的 saveAll(),注意过滤重复(比如用 URL 做唯一索引 + ignore(true))。
三、配置系统级定时任务
ThinkPHP 本身不提供定时调度,需交由操作系统完成:
-
Linux(推荐):编辑 crontab:
crontab -e,添加一行:
0 */2 * * * /usr/bin/php /www/wwwroot/your-project/think spider_news >> /www/wwwroot/your-project/runtime/log/spider.log 2>&1
表示每两小时执行一次think spider_news指令 -
Windows:用「任务计划程序」新建基本任务,触发器设为每天/每小时,操作设为启动程序:
C:\php\php.exe C:\www\your-project\think spider_news
注意路径写绝对路径,PHP 可执行文件也要写全路径,避免环境变量问题。
四、防采集风控与日志记录
真实站点常有限流、验证码、UA 校验等反爬机制,需主动适配:
- 每次请求后加
sleep(rand(1,3)),模拟人工间隔 - 准备多个 UA 和代理 IP(简单场景可用免费 HTTP 代理池轮换)
- 用
try/catch包裹采集逻辑,失败时记录错误到日志:
\think\Log::write('Spider failed: ' . $e->getMessage(), 'error'); - 入库前检查关键字段是否为空,跳过脏数据
日志建议单独存档(如按天分文件),方便排查漏采或异常中断。



















