大神论坛

找回密码
快速注册
查看: 85 | 回复: 0

[源码] 爬取智联招聘数据

主题

帖子

0

积分

初入江湖

UID
666
积分
0
精华
威望
0 点
违规
大神币
68 枚
注册时间
2023-10-14 10:49
发表于 2023-12-16 15:59
本帖最后由 eoven8 于 2023-12-16 15:59 编辑

混迹论坛多年,三脚猫水平不知道能分享点什么,总是伸手又不太好意思
第一次发帖,代码比较水,佬勿喷,谢谢!

有所启发,心血来潮(摸鱼无聊- -!)想看看智联是不是能同理可得

摸索了一下发现,居然麻油加密字符串......

算了,爬都爬了 。。那就简单的写个例子吧

做了输入地区名称取得地区码逻辑
实现根据关键词查询岗位列表
小白可以参考参考

先附上一张效果图:

引用了Hutool工具包:

<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>
</dependencies>

以下是代码部分:

package org.example;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

public class Main {
/**
* 主函数
* [url=home.php?mod=space&uid=952169]@Param[/url] args 命令行参数
*/
public static void main(String[] args) {
String searchKye="骑手"; //搜索关键字
int pageIndex =1; //当前页码
int pageSize = 10; //每页条数
String cityName = "思明区";//您想搜索的地区,如厦门 或 海沧区 市级不带市字,区级需加区

String cityCode = findCode(cityName);//根据输入的的确查询对应的地区码
if( StrUtil.isEmpty(cityCode)){
System.out.println("未找到该城市对应的地区码");
return;
}
String randomNum=String.valueOf(Math.random()).substring(0,10);
String url = "https://m.zhaopin.com/api/sou/search-position?" +
"pageCode=6019" +
"&S_SOU_FULL_INDEX=" +searchKye+//搜索关键词
"&S_SOU_WORK_CITY=" +Integer.valueOf(cityCode)+
"&pageIndex="+pageIndex +
"&isEndPage=false" +
"&pageSize=" +pageSize+//每页条数
"&platform=7" +
"&_v="+randomNum; // 构建搜索URL
String result = HttpUtil.createGet(url) // 发送GET请求
.header("User-Agent", "Apifox/1.0.0 (https://apifox.com)") // 设置请求头
.execute() // 执行请求
.body(); // 获取响应体
JSONObject resultJson = new JSONObject(result); // 将响应体解析为JSON对象
if(StrUtil.isNotEmpty(resultJson.getStr("code"))&&resultJson.getInt("code")==200){ // 判断搜索结果是否成功
JSONArray jsonArray = resultJson.getJSONObject("data").getJSONArray("list"); // 获取职位列表
for (int i = 0; i < jsonArray.size(); i++) { // 遍历职位列表
JSONObject jsonObject = jsonArray.getJSONObject(i); // 获取当前职位信息
JSONObject customJson = jsonObject.getJSONObject("cardCustomJson");
String sb = "";
sb+="公司名称:"+customJson.getStr("companyName")+" "
+"岗位名称:"+jsonObject.getStr("name")+" "
+"所在位置:"+customJson.getStr("address")+" "
+"薪资范围:"+customJson.getStr("salary60")+" "
+"公司规模:"+customJson.getStr("strengthLabel")+" "
+"投递直达链接:"+jsonObject.getStr("positionURL");
System.out.println(sb); // 输出职位的自定义信息
}
}
}



/**
* 根据关键词查找代码
* @param keyword 关键词
* [url=home.php?mod=space&uid=155549]@Return[/url] 代码字符串
*/
private static String findCode(String keyword){
String randomNum=String.valueOf(Math.random()).substring(0,10);
String url = "https://m.zhaopin.com/api/base-data?" +
"keys=region_relation" +
"&scenario=plat_mobile" +
"&platform=7" +
"&_v="+randomNum; // 构建搜索URL
String result = HttpUtil.createGet(url) // 发送GET请求
.header("User-Agent", "Apifox/1.0.0 (https://apifox.com)") // 设置请求头
.execute() // 执行请求
.body(); // 获取响应体

JSONObject jsonObject = JSONUtil.parseObj(result); // 解析 JSON 数据
JSONArray regionList = jsonObject.getJSONObject("data").getJSONArray("region_relation"); // 获取 region_relation 数组
return findCode(regionList, keyword);
}

/**
* 递归查找指定关键字在地区列表中的 code 值
* @param regionList 地区列表
* @param keyword 查找的关键字
* @return 找到匹配的 region 时返回对应的 code 值,否则返回 null
*/
private static String findCode(JSONArray regionList, String keyword) {
for (int i = 0; i < regionList.size(); i++) {
JSONObject region = regionList.getJSONObject(i);
if (keyword.equals(region.getStr("name"))) {
return region.getStr("code");
} else {
JSONArray sublist = region.getJSONArray("sublist");
if (sublist != null && sublist.size() > 0) {
String code = findCode(sublist, keyword); // 递归调用,遍历子列表
if (code != null) {
return code; // 如果找到匹配的 region,则直接返回对应的 code 值
}
}
}
}
return null;
}



}


注:若转载请注明大神论坛来源(本贴地址)与作者信息。

返回顶部