PHP POST分页爬虫问题:无法获取日本HelloWork站点多页数据
解决HelloWork求职站点分页爬取问题
核心问题分析
这个站点是基于Java Web框架的求职平台,分页依赖表单提交+会话Cookie(JSESSIONID),两个关键点缺一不可:
- 所有请求必须复用同一个JSESSIONID,否则会被视为新会话,无法获取后续分页数据
- 分页请求需要传递完整的表单参数(不是简单修改URL参数),必须从浏览器抓包获取所有提交字段
具体解决步骤
1. 抓包获取分页表单参数
打开浏览器F12→Network面板,点击分页按钮(比如第2页),找到对应的POST请求,复制Form Data里的所有字段,常见必填项包括:
action: 分页对应的动作(如moveToPage或nextPage)screenId: 固定值GECA110010pageNo: 目标页码(如2)- 其他隐藏字段(如
searchCondition、__struts_token等,站点会动态生成)
2. PHP代码改造(复用会话+传递正确表单参数)
使用cURL的CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE持久化会话Cookie,同时构造完整的表单数据:
<?php // 初始化会话Cookie保存路径 $cookieFile = tempnam(sys_get_temp_dir(), 'hellowork_cookie'); // 第一步:获取初始页面,保存JSESSIONID $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.hellowork.mhlw.go.jp/kensaku/GECA110010.do?action=initDisp&screenId=GECA110010'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 保存Cookie到本地文件 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); $firstPageContent = curl_exec($ch); curl_close($ch); // 第二步:爬取指定页码(示例:第2页) $targetPage = 2; // 从抓包结果中复制完整表单参数,根据实际情况补充 $postData = [ 'action' => 'moveToPage', // 替换为抓包到的分页动作 'screenId' => 'GECA110010', 'pageNo' => (string)$targetPage, 'searchCondition' => '...', // 初始页面的搜索条件,需从第一页HTML中解析或抓包获取 '__struts_token' => '...', // 如果有令牌字段必须带上 // 其他必填字段如currentPage、totalCount等 ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.hellowork.mhlw.go.jp/kensaku/GECA110010.do'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 复用之前保存的会话Cookie curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); $pageContent = curl_exec($ch); if(curl_errno($ch)){ echo 'CURL错误:' . curl_error($ch); } curl_close($ch); // 处理并输出页面内容 echo $pageContent; // 清理临时Cookie文件 unlink($cookieFile); ?>
3. 关键注意事项
- 必须严格复制抓包到的所有表单字段,遗漏任何一个都会导致请求失败
- 动态生成的令牌字段(如
__struts_token)需要从第一页HTML中解析,不能硬编码 - 控制请求频率,避免触发站点反爬机制(如IP封禁)
内容的提问来源于stack exchange,提问作者Saurav g
相关产品推荐
相关产品推荐

