Guzzle PHP爬取数据无代理报418、配代理遇504超时如何解决
Guzzle爬取站点报418、代理504问题解决方法
两个报错分别对应反爬识别、代理不可用两类问题,按以下步骤调整即可:
418机器人识别报错解决
默认初始化的Guzzle客户端请求头自带Guzzle标识,缺少正常浏览器的常规请求字段,直接请求会被反爬规则直接拦截。调整客户端初始化参数,补全真实浏览器请求头即可:
$httpClient = new \GuzzleHttp\Client([ 'headers' => [ // 替换成真实浏览器UA,不要用默认的Guzzle UA 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language' => 'zh-CN,zh;q=0.8,en;q=0.2', ], 'timeout' => 10, 'connect_timeout' => 5, 'http_errors' => false, // 开启自动cookie维护,模拟正常会话 'cookies' => true, ]);
如果站点校验Referer,补充对应字段即可。注意不要直接请求深层页面,先访问站点首页拿到合法cookie后再请求目标页,拦截概率会低很多。
代理配置后504超时解决
你当前用的代理http://92.51.77.126本身存在问题:
- 代理地址没有写端口,正常代理地址格式必须带端口,完整格式为
http://IP:端口,需要账号认证的代理格式为http://用户名:密码@IP:端口 - 免费公开代理绝大多数都已经失效、或者连通速度极差,很容易出现504超时,就算临时能连通,IP也早就被各大站点的反爬库标记为代理IP,照样会被拦截
- 部分代理不支持HTTPS站点访问,如果你爬的是HTTPS站点,要确认代理支持对应协议
替换为可用的高匿住宅代理,写全代理地址格式即可解决504问题。
完整可用示例代码
// 替换为你自己的可用高匿代理,写全IP+端口 $proxy = 'http://替换为可用代理IP:对应端口'; // 目标站点首页地址,用于先建立会话拿cookie $homeUrl = '目标站点根域名地址'; $targetUrl = '你要爬取的目标页面地址'; $httpClient = new \GuzzleHttp\Client([ 'proxy' => $proxy, 'headers' => [ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language' => 'zh-CN,zh;q=0.9', ], 'timeout' => 15, 'connect_timeout' => 5, 'http_errors' => false, 'cookies' => true, ]); // 先访问首页建立合法会话 $httpClient->get($homeUrl); // 再请求目标页面 $response = $httpClient->get($targetUrl); $htmlString = (string)$response->getBody();
额外注意:控制请求频率,每次请求间隔随机2-5秒,短时间高频请求不管换什么代理都会被拦截。如果调整后还是返回418,说明站点有JS挑战、验证码之类的动态反爬逻辑,纯HTTP请求无法绕过,需要配合无头浏览器渲染页面后再提取内容。
内容的提问来源于stack exchange,提问作者ubaid ismail
相关产品推荐
相关产品推荐

