如何用PHP抓取Workday招聘网站的职位信息?
解决Workday招聘接口POST请求超时问题
我尝试从Workday招聘站点(比如宝洁的招聘页面)抓取职位信息,通过浏览器开发者工具发现,职位数据来自一个POST接口,但用PHP 8+Guzzle 7编写的请求代码一直超时,无法获取200响应。
原问题代码
原请求代码如下:
$headers = [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'Accept-Encoding' => 'gzip, deflate, br', 'Accept-Language' => 'en-US', 'Connection' => 'keep-alive', 'Content-Length' => 58, 'Host' => 'pg.wd5.myworkdayjobs.com', 'Origin' => 'https://pg.wd5.myworkdayjobs.com', 'Referer' => 'https://pg.wd5.myworkdayjobs.com/en-US/1000', ]; $client = new \GuzzleHttp\Client([ 'headers' => $headers ]); $response = $client->post("https://pg.wd5.myworkdayjobs.com/wday/cxs/pg/1000/jobs", [ 'timeout' => 5, 'form_params' => ["appliedFacets" => [], "limit" => 20, "offset" => 0, "searchText" => ""] ]);
问题分析与修改方案
原代码存在几个关键问题:
- 请求体格式错误:接口要求JSON格式的请求体,但原代码用了
form_params(会发送application/x-www-form-urlencoded格式数据),和浏览器请求格式不符。 - 硬编码Content-Length:手动设置的长度可能和实际JSON内容不匹配,导致服务器解析异常。
- 缺失必要请求头:Workday接口通常需要
User-Agent模拟浏览器,否则易被拦截;Connection头建议用Guzzle默认值,避免冲突。 - 超时时间过短:5秒超时不足以应对Workday服务器的响应延迟。
修改后的代码:
use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; try { $headers = [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'Accept-Encoding' => 'gzip, deflate, br', 'Accept-Language' => 'en-US', 'Origin' => 'https://pg.wd5.myworkdayjobs.com', 'Referer' => 'https://pg.wd5.myworkdayjobs.com/en-US/1000', 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]; $client = new Client([ 'headers' => $headers, 'timeout' => 15, 'verify' => true, ]); $payload = [ "appliedFacets" => [], "limit" => 20, "offset" => 0, "searchText" => "" ]; $response = $client->post("https://pg.wd5.myworkdayjobs.com/wday/cxs/pg/1000/jobs", [ 'json' => $payload ]); $jsonData = json_decode($response->getBody(), true); print_r($jsonData); } catch (RequestException $e) { echo "请求异常: " . $e->getMessage(); if ($e->hasResponse()) { echo "\n响应状态码: " . $e->getResponse()->getStatusCode(); echo "\n响应内容: " . $e->getResponse()->getBody(); } }
修改说明
- 用
json参数替代form_params:Guzzle会自动将数组编码为JSON字符串,并设置正确的Content-Type和Content-Length头,无需手动配置。 - 添加
User-Agent头:模拟真实浏览器请求,避免被识别为爬虫拦截。 - 移除硬编码的
Content-Length和Host头:Guzzle会自动生成这些头,手动设置易导致不匹配。 - 延长超时时间到15秒:给服务器足够的响应时间。
- 添加异常捕获:便于排查请求失败的具体原因,如状态码、响应内容等。
内容的提问来源于stack exchange,提问作者Connor Leech
相关产品推荐
相关产品推荐

