459 发表于 2023-12-15 11:06

智联招聘简单爬取数据例子

混迹论坛多年,三脚猫水平不知道能分享点什么,总是伸手又不太好意思
第一次发帖,代码比较水,佬勿喷,谢谢!
https://static.52pojie.cn/static/image/hrline/1.gif


看了大佬发的逆向前程无忧例子https://www.52pojie.cn/thread-1752766-1-3.html
有所启发,心血来潮(摸鱼无聊- -!)想看看智联是不是能同理可得

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


{:301_973:}算了,爬都爬了 。。那就简单的写个例子吧

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

先附上一张效果图:




引用了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 {
    /**
   * 主函数
   * @Param 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 关键词
   * @Return 代码字符串
   */
    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;
    }



}

lxb187 发表于 2023-12-21 11:29

459 发表于 2023-12-15 14:39
没考虑那么多因素,只是单纯的采了一下,没搞得那么完善

也是很不错的,为你这种精神打call。话说现在大数据一下子就不火了,数据采集这块也不待人见了,好难啊,大兄弟这块还有啥更好的前途方向建议嘛?

mcby 发表于 2023-12-15 14:10

感谢分享,回头运行一下看看

lxb187 发表于 2023-12-15 14:30

现在不封ip的嘛 可以直接采集嘛?给大兄弟点赞666666*10086*10000*10001

459 发表于 2023-12-15 14:39

lxb187 发表于 2023-12-15 14:30
现在不封ip的嘛 可以直接采集嘛?给大兄弟点赞666666*10086*10000*10001

没考虑那么多因素,只是单纯的采了一下,没搞得那么完善

jr001 发表于 2023-12-15 15:21

学习了感谢

Jave007 发表于 2023-12-15 16:25

有Python版本的吗?

459 发表于 2023-12-15 16:28

Jave007 发表于 2023-12-15 16:25
有Python版本的吗?

把我代码copy过去gpt转一下就行了

FruitBaby 发表于 2023-12-15 19:46

jsoup爬虫很方便,

liuhuacong 发表于 2023-12-15 21:59

感谢分享
页: [1] 2
查看完整版本: 智联招聘简单爬取数据例子