You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:50:11