这里不是教大家如何解密隐藏信息,那个用java来做,有点困难,对于我这种小白来说,肯定是行不通的。我这个方法属于绕道而行。但是可以完成java对51job 的爬虫
先上一下成果。
准备阶段我就不多说了,用的是maven+boot,核心包用webmagic0.7.3和mybatis-common,其他的就大家根据自己的添加就好。
1.第一步准备好要爬取的数据,这里除了id全是String,类型,因为我们只想获取到数据,不进行输出,所以只需要用String就好,避免需要转换数据类型,dataformat问题。
2.写server
需要判断数据是否已经存在,再进行新增或者修改,因为url地址只能是唯一的,所以根据url地址查
3.编写task,也就是爬虫
3.1先写定时任务,把Spider写好,这里的重点就是设置代理,代理大家可以取网上找,最好是花钱买一下,几个小时的也就几块钱,建议买动态代理。因为51有防爬虫机制,你的ip如果被禁,爬到的页面就是加密过的页面,因此动态代理,可以一直改你的ip地址,被禁了,大不了换一个。
3.2编写site
这里只需要加入头信息就好,特殊情况下可以加cookie,最好是你已经登陆了51,然后拿到header和cookie
3.3编写process(Page page)
@Override
public void process(Page page) {
String jsonText = page.getHtml().css("script").regex(".*SEARCH_RESULT.*").get();
//把获取到的数据变成Json对象
if (StringUtils.isNotBlank(jsonText)){
String substring = jsonText.substring(jsonText.indexOf("{"), jsonText.lastIndexOf("}") + 1);
JSONObject parse =(JSONObject) JSONObject.parse(substring);
JSONArray engine_jds = parse.getJSONArray("engine_jds");
page.putField("engine_jds",engine_jds);
if (engine_jds.size()>0){
for (int i = 0; i < engine_jds.size(); i++) {
JSONObject o = (JSONObject)engine_jds.get(i);
Item item=new Item();
item.setCompanyName(o.get("company_name").toString());
item.setCompanyAddr(o.get("workarea_text").toString());
item.setCompanyInfo(o.get("companytype_text").toString()+o.get("companyind_text").toString()+o.get("companysize_text").toString());
item.setJobName(o.get("job_name").toString());
item.setJobAddr(o.get("workarea_text").toString());
item.setJobInfo(o.get("jobwelf").toString());
item.setSalary(o.get("providesalary_text").toString());
item.setUrl(o.get("job_href").toString());
item.setTime(o.get("issuedate").toString());
page.putField("item"+i,item);
}
//获取下一页的数据,加入到任务schedule中
for (int i = 1; i <=5 ; i++) {
System.out.println("第"+i+"次爬虫");
page.addTargetRequest("https://search.51job.com/list/000000,000000,0000,00,9,99,java,2,"+i+".html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=");
}
}else{
return;//如果没有数据结束爬虫
}
}else{
System.out.println("没爬到数据");
return;
}
}
3.3.1解析代码
我获取到的是这个页面的源码
而这个页面中的源码(看图分析)
拿到Json对象就好说了,就可以获取到里面的信息并且存入数据库。
打个断点运行下,发现数据已经完全都拿到了。
3.3.2有人会说,你拿到的数据不全,教程里是根据详情页拿数据的
这个我当然知道,因为试了一晚上,如果根据详情页那数据,在获取page上就会有问题
这个就是被51加密过的详情页,因此对于我这种小白来说不可取
3.4 将数据存入数据库,用到pipeline,pipeline吃了console和file的方式外,还支持自定义PipeLine,实现Pipeline接口就行,重写方法,这里我把循环画了高亮,是需要大家注意,我们用page.putField会把数据存入到ResultItems中,如果全部存入同一个名称,比如page.putField(“item“,内容),那么新内容就会更新掉就内容,因此这个名词不能重复,所以需要加循环的标识
如果已经爬取完整个页面,重新爬取一个page,那么resultItem中的数据也会跟着清空(因为不是同一个page),所以不需要纠结,第二个页面会不会和第一个页面的resultItem里面的命名重复问题。
ok最新的java爬虫51就分享结束了
最后推荐使用青果网络的ip,因为新用户不要钱