composer不提供爬虫工具,仅管理依赖;需组合guzzlehttp\client发请求与symfony/dom-crawler解析html,js渲染内容需puppeteer等外部方案。

Composer 安装爬虫工具前先搞清“爬虫工具”指什么
Composer 本身不提供爬虫工具,它只是 PHP 的依赖管理器。所谓“安装爬虫工具”,实际是安装能发 HTTP 请求、解析 HTML、处理重定向等的第三方库。最常用的是 GuzzleHttp\Client(发请求) + symfony/dom-crawler(解析 HTML),而不是某个叫“爬虫”的一键包。
直接运行 composer require guzzlehttp/guzzle 只装了请求层,没解析能力;如果硬要“开箱爬网页”,至少得补上解析组件。
- 纯发请求(如调 API)→ 只需
guzzlehttp/guzzle - 抓网页、提取
<a href></a>或表单 → 必须加symfony/dom-crawler或sunra/php-simple-html-dom-parser - 需要 JS 渲染页面?Composer 搞不定,得换 Puppeteer/Playwright,PHP 侧只能调外部服务或 headless Chrome
用 Composer 引入 Guzzle 组件的正确命令和常见报错
composer require guzzlehttp/guzzle 是标准写法,但实际执行时容易卡在几个地方:
- PHP 版本不匹配:Guzzle 7 要求 PHP >= 7.2;若系统是 PHP 7.0,会报
Your requirements could not be resolved—— 改用composer require guzzlehttp/guzzle:^6.5 - 国内源没切好:默认走 packagist.org,超时或慢。临时加速可加
-vvv看卡在哪,长期建议composer config -g repo.packagist composer https://packagist.phpcomposer.com(注意该镜像已停,推荐用阿里云:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/) - 项目没初始化:如果当前目录没有
composer.json,require会自动创建,但若之前手动删过vendor/又没清缓存,可能提示Could not delete ...—— 此时先composer clear-cache再重试
Guzzle 实例化时传参差异直接影响重试和超时行为
很多人写了 new \GuzzleHttp\Client() 就开始 ->get(),结果遇到网络抖动就整个脚本崩掉。关键在构造函数参数:
- 不设参数 → 默认 0 秒超时(实际是 PHP 默认
default_socket_timeout,常为 60 秒),无重试 - 加
['timeout' => 5, 'connect_timeout' => 3]→ 连接 3 秒内建不成就抛异常,建立连接后 5 秒内没返回也断开 - 要自动重试(比如目标站偶发 502),得配
handler:用GuzzleHttp\HandlerStack::create()套GuzzleHttp\Middleware::retry(),否则retry配置项根本不起作用 - 别漏
http_errors => false:否则 4xx/5xx 响应直接 throw 异常,没法用$res->getStatusCode()判断再处理
示例最小健壮写法:
$client = new \GuzzleHttp\Client([
'timeout' => 5,
'connect_timeout' => 3,
'http_errors' => false,
'headers' => ['User-Agent' => 'Mozilla/5.0']
]);
DOM Crawler 和 Guzzle 配合时容易忽略的编码与上下文问题
用 symfony/dom-crawler 解析 Guzzle 返回的 HTML,看似简单,但两处不注意就会提取不到内容:
- 响应 body 是二进制流,不是字符串:必须用
$res->getBody()->getContents()或(string) $res->getBody(),直接传$res->getBody()给Crawler构造函数会报错Argument 1 passed to Symfony\Component\DomCrawler\Crawler::__construct() must be of the type string or null - 网页声明了
charset=gb2312但 PHP 默认按 UTF-8 解析 → 中文变乱码,$crawler->filter('title')->text()取出来是空或问号。得先mb_convert_encoding($html, 'UTF-8', 'GB2312')再喂给Crawler - 如果目标页有 JS 动态插入内容(比如评论区懒加载),
DomCrawler看不见那些节点——它只处理初始 HTML 字符串,不是浏览器环境
真正做数据采集时,协议头、Cookie 复用、反爬策略应对、IP 轮换这些都不在 Composer 或 Guzzle 范围内,得自己设计逻辑。依赖装得再全,HTTP 层之下仍是黑盒。









