原文出自:自我的青春
笔者说明~~~!!!只用于学习交流,私自用于其他途径,后果自负!!!
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(" ", "").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的递增就可以