2022最新自研究51job(java爬虫)(因为黑马教程里的都不太好用了,会被js加密隐藏信息)

这里不是教大家如何解密隐藏信息,那个用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&degreefrom=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,因为新用户不要钱

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hpeacheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值