thinkphp6.x可通过集成guzzle和domcrawler等第三方库实现结构化网页采集与清洗。需配置采集规则、编写命令行指令、执行字段清洗、去重入库,并注意反爬策略、编码处理及安全过滤。

ThinkPHP6.x 本身不内置采集功能,但可以借助第三方 HTTP 客户端(如 guzzlehttp/guzzle)和 HTML 解析库(如 symfony/dom-crawler 或 sunra/php-simple-html-dom-parser),结合 TP6 的命令行指令、模型和数据库操作,实现结构化内容采集与清洗。
一、环境准备与依赖安装
在 ThinkPHP6 项目根目录执行:
composer require guzzlehttp/guzzle composer require symfony/dom-crawler composer require symfony/css-selector
若需处理编码乱码或简单 DOM 操作,也可选装:
composer require sunra/php-simple-html-dom-parser
注意:TP6 默认使用 PHP 7.2+,确保扩展兼容;部分目标站点含反爬机制,建议配置 User-Agent、Referer 和延迟请求。
二、定义采集规则配置(可存数据库或 YAML/JSON 文件)
采集规则应包含:目标 URL、选择器(CSS 或 XPath)、字段映射、清洗规则(如去空格、过滤 script 标签、截取摘要)、发布时间正则提取等。例如:
[
"site" => "example-news",
"url" => "https://example.com/news/list?page={page}",
"list_selector" => ".news-item",
"fields" => [
"title" => "h2 a|text",
"url" => "h2 a|attr:href",
"summary" => ".intro|text|strip_tags|trim",
"pubtime" => ".date|text|regex:/\d{4}-\d{2}-\d{2}/"
],
"page_range" => [1, 3],
"delay_ms" => 800
]
说明:| 表示管道式处理,支持链式清洗;规则可动态加载,便于多站点管理。
三、编写命令行采集指令(推荐)
运行:php think make:command CollectNews,然后在 app/command/CollectNews.php 中编写:
- 使用
GuzzleHttp\Client请求页面,自动处理重定向和 gzip - 用
Symfony\Component\DomCrawler\Crawler解析 HTML,按规则提取节点 - 对每个字段执行清洗逻辑(如
strip_tags()、mb_substr()、正则替换联系方式或广告语) - 检查重复(如通过源 URL 哈希去重),调用模型
NewsModel::updateOrCreate()写入 - 记录日志(
think\Log::record())和异常捕获,避免单条失败中断整体流程
四、清洗与防重关键实践
清洗不只是去标签,更需业务适配:
- 正文图片路径补全:将
src="/uploads/1.jpg"转为完整 URLhttps://example.com/uploads/1.jpg - 时间标准化:把 “3小时前”、“昨天”、“2024年5月6日” 统一转为 Y-m-d H:i:s 格式
- 敏感词过滤:加载本地词库,用
str_replace()或正则批量替换 - 标题/摘要去重:入库前用
md5($source_url)或sha1($title . $content)生成唯一键 - 内容安全:禁用
eval、javascript:、onerror=等潜在 XSS 片段
清洗逻辑建议封装成独立服务类(如 app/service/ContentCleaner.php),便于复用和单元测试。
不复杂但容易忽略:采集频率需遵守 robots.txt,生产环境加 Redis 分布式锁防并发重复采集,重要数据建议保留原始 HTML 片段作审计备份。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











