java爬取拉勾网职位数据

原文出自:自我的青春


笔者说明~~~!!!只用于学习交流,私自用于其他途径,后果自负!!!

     1、相关jar准备

         fastjson-1.1.41.jar ,jsoup-1.6.2.jar,commons-httpclient-3.1.jar

     2、进行网站请求分析

         

        

  如上图,得到链接: https://www.lagou.com/jobs/positionAjax.json?city="+city+"&needAddtionalResult=false&first="+isTrue+"&kd="+searchKeyWords+"&pn="+i;

2、分析json数据,并创建相关实体bean

我们需要创建如下bean,HrInfoMap:招聘人员信息;CompanyInfo:公司招聘基本信息;JobRelatedDetail:职位描述和工作地址;

All :关联id和其他信息的封装集合类。下面代码做参考,属性字段需要什么建立什么,并生成相关方法

/**
 * hr相关信息
 * 
 *
 */
public class HrInfoMap {
	
	
	/**
	 * 电话
	 */
	private String phone;
	/**
	 * 职位名称
	 */
	private String positionName;
	/**
	 * 邮箱
	 */
	private String receiveEmail;
	/**
	 * 用户id
	 */
	private String userId;
	/**
	 * 名称
	 */
	private String realName;
}
__________________________________
/**
 * 公司相关信息以及基本要求
 * 
 *
 */
public class CompanyInfo {
		/**
		 * 公司简称
		 */
	 private String companyShortName;
		/**
		 * 公司id
		 */
	 private String companyId;
		/**
		 * 创建时间
		 */
	 private String createTime;
		/**
		 * 职位id
		 */
	 private String positionId;
	 /**
	  * 职位诱惑
	  */
	 private String positionAdvantage;
	
	 /**
	  * 福利
	  */
	 private String companyLabelList[]; 
}
____________________________________
/**
 * 职位相关详细信息
 * 
 *
 */
public class JobRelatedDetail {
	
	
	protected final static String  laGouUrl="https://www.lagou.com/jobs/";
	protected final static String  laGouPhoUrl="https://www.lagou.com/";
	/**
	 * 职位描述
	 */
	private String JobDescription;
	
	
	
	/**
	 * 工作地址
	 */
	private String JobPlace;
}
____________________________________
/**
 * hr信息,和对应招聘id
 * 
 *
 */
public class All {
	/**
	 * 在人员信息的外层,对应公司信息的positionId,同时也是详细招聘信息的页面标识id
	 */
	private String id;
	private HrInfoMap hrIn;
	private CompanyInfo compa;
	private JobRelatedDetail jobRelatedDetail;
}
3、下面是获取json数据的代码(url可以是上面的代码进行变量代入也可以直接先使用下面的)


 https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false&first=true&kd=&pn=1
             String urlNameString = url;
		URL realUrl = new URL(urlNameString);
		// 打开和URL之间的连接
		URLConnection connection = realUrl.openConnection();
		// 建立实际的连接
		connection.connect();
		// 获取所有响应头字段
		InputStream is=connection.getInputStream();       //以输入流的形式返回  
		//将输入流转换成字符串  
		ByteArrayOutputStream baos=new ByteArrayOutputStream();  
		byte [] buffer=new byte[1024];  
		int len=0;  
		while((len=is.read(buffer))!=-1){  
		    baos.write(buffer, 0, len);  
		};  
		String jsonString=baos.toString(); 
		System.out.println(jsonString);
4、将json数据转换为java对象


    

 JSONObject object = JSON.parseObject(jsonString);
		List<HrInfoMap> result=null;
		//负责招聘人相关信息
		List<All> all=new ArrayList<All>();
        JSONObject data = (JSONObject) object.get("content");
        JSONObject hrInfoMapJSon = (JSONObject) data.get("hrInfoMap");
        Set<Entry<String,Object>> entrySet = hrInfoMapJSon.entrySet();
        StringBuffer ss=null;
        All hr=null;
        for (Entry<String, Object> entry : entrySet) {
            	hr=new All();
            	ss=new StringBuffer();
            	result=new ArrayList<HrInfoMap>();
            	 ss.append("[");
            	 ss.append(entry.getValue());
            	 ss.append("]");
             result= JSON.parseArray(ss.toString(), HrInfoMap.class);		
             hr.setId(entry.getKey());
             hr.setHrIn(result.get(0));
            	all.add(hr);
		}

        JSONObject MapJSon = (JSONObject) data.get("positionResult");
       // JSONObject MapJSons = (JSONObject) MapJSon.get("locationInfo");
        JSONArray jsonArray = MapJSon.getJSONArray("result");
        List<CompanyInfo>  compList=new ArrayList<CompanyInfo>();
      //公司相关信息以及基本要求
        compList= JSON.parseArray(jsonArray.toString(), CompanyInfo.class);	
        //将公司信息和招聘人员信息进行匹配
	       for (All hrall : all) {
	        	for (CompanyInfo companyInfo : compList) {
	    			if(hrall.getId().equals(companyInfo.getPositionId())){
	    				hrall.setCompa(companyInfo);
	    			}
	    		}
				
	        }
	       StringBuffer jobDescription=null;
	       StringBuffer jobPlace=null;
	       JobRelatedDetail  job=null;
	     //进行职位描述和工作地址的获取
	      for (All hrAll : all) {
	    	   jobPlace=new StringBuffer();
	    	   jobDescription=new StringBuffer();
	    	   job=new JobRelatedDetail();
	    	  String html=GetHtml.getHtmlStringByUrl(JobRelatedDetail.laGouUrl+hrAll.getId()+".html");
				Document doc = Jsoup.parse(html);
				Elements elementsByClass = doc.getElementsByClass("job_bt");
				for (Element element : elementsByClass) {
					Elements tagName = element.getElementsByTag("p");
					for (Element elements : tagName) {
						elements.select("br").remove();
						jobDescription.append(elements.html().toString().replaceAll("<br />", "")+"\n");
					}
				}
				job.setJobDescription(jobDescription.toString().replaceAll("&nbsp;", "").replaceAll("<strong>", "").replaceAll("</strong>", ""));
				Elements elementsByClass2 = doc.getElementsByClass("work_addr");
				Elements elementsByTag = elementsByClass2.get(0).getElementsByTag("a");
				for (int i = 0; i < elementsByTag.size(); i++) {
					if(i<=2){
						jobPlace.append(elementsByTag.get(i).html()+"-");
					}
				}
				elementsByClass2.select("a").remove();
				jobPlace.append(elementsByClass2.html().replaceAll("-", "").replaceAll(" ", ""));
				job.setJobPlace(jobPlace.toString());
				hrAll.setJobRelatedDetail(job);
			}


5、下图为程序运行效果


结语:初步的爬取已经完成了,大致的思路是根据根url进行json数据的获取,进行招聘人员信息的转换和公司基础信息的转换,这里json数据里招聘人员信息的键id和公司信息的positionId相对应,并且域名+id.html是该信息职位描述的html页面。需要注意的是,json转换java对象,以及jsoup的html页面截取信息,在上面代码中职位信息的代码

String html=GetHtml.getHtmlStringByUrl(JobRelatedDetail.laGouUrl+hrAll.getId()+".html");
GetHtml.getHtmlStringByUrl的代码并么有给出,这里可以根据
Document document = Jsoup.connect("").get();进行获取,如果需要进行职位信息的全面获取,进行根url参数pn的递增就可以



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
由于涉及到爬取,可能会侵犯拉勾的相关规定和法律法规。因此,我们强烈建议您遵守相关规定,合法合规地进行爬取。 以下是简单的示例代码,用于爬取拉勾上的招聘信息: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class LaGouSpider { public static void main(String[] args) { String url = "https://www.lagou.com/zhaopin/Java/"; try { Document doc = Jsoup.connect(url).get(); Elements jobList = doc.select(".job-list li"); for (Element job : jobList) { String jobName = job.select(".position_link h3").text(); String company = job.select(".company_name a").text(); String salary = job.select(".money").text(); System.out.println("职位名称:" + jobName); System.out.println("公司名称:" + company); System.out.println("薪资待遇:" + salary); System.out.println("------------------------"); } } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例代码使用了Jsoup库,通过连接拉勾Java职位页面,获取页面上的招聘信息。具体步骤如下: 1. 使用Jsoup.connect()方法连接要爬取的页面。 2. 使用doc.select()方法选择页面上需要提取的元素。 3. 遍历选择的元素,使用element.select()方法获取元素内的具体信息。 需要注意的是,由于拉勾的页面结构可能会随时改变,所以代码需要根据实际情况进行调整。此外,如果您要进行大规模的爬取,需要加入相关的限制和措施,以避免对站造成过大的负担和影响。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值