2020年寒假假期总结0117

  WebMagic实战:爬取51找工作的工作信息至数据库

  这里只放出关键代码,完整代码上传至GitHub:https://github.com/heiyang1125/WebMagicLivingExample.git

  在爬取过程中,与上次Jsoup不同的是,我们需要从不同的网页中去爬取网页,然后使用WebMagic的代码去实现爬取内容。所以我们需要知道中主网站如何跳到职业的具体页面,然后进行获取信息

 

   从图中我们可以看出,a标签已经写出了链接的地址,通过检查我们可以看到,所有的职业信息都在id为resultList的div里面,同时再向下走就是class为el的div中,得代码:

        //解析页面,获取招聘信息详情的url地址
        List<Selectable> list = page.getHt  ml().css("div#resultList div.el").nodes();

  然后判断集合的数量,如果大于0,则是职业推荐的主页面,然后开始进入每个链接下载页面进行分析,这里就不一一分析,直接上代码:

        //创建招聘详情对象
        JobInfo jobInfo = new JobInfo();

        if (page != null) {
            //解析页面
            Html html = page.getHtml();

            //获取数据,封装到对象中
            jobInfo.setCompanyName(html.css("div.cn p.cname a", "text").toString());
            System.out.println("公司名称:"+jobInfo.getCompanyName());
            try {
                jobInfo.setCompanyAddr(Jsoup.parse(html.css("div.bmsg").nodes().get(1).toString()).text());
            }catch (Exception e){
                jobInfo.setCompanyAddr("未找到此内容");
            }

             System.out.println("公司位置:"+jobInfo.getCompanyAddr());
            jobInfo.setCompanyInfo(Jsoup.parse(html.css("div.tmsg").toString()).text());
            System.out.println("公司简介:"+jobInfo.getCompanyInfo());
            jobInfo.setJobName(html.css("div.cn h1", "text").toString());
            System.out.println("职位名称:"+jobInfo.getJobName());
            try {
                jobInfo.setJobAddr(Jsoup.parse(html.css("p.fp").nodes().get(2).regex("</span>(.*?)</p>").toString()).text());
            }catch (Exception e){
                jobInfo.setJobAddr("未找到此内容");
            }
            System.out.println("工作位置:"+jobInfo.getJobAddr());
            jobInfo.setJobInfo(Jsoup.parse(html.css("div.job_msg").toString()).text());
            System.out.println("工作职责:"+jobInfo.getJobInfo());
            jobInfo.setUrl(page.getUrl().toString());

            //获取薪资
            Integer[] salary = MathSalary.getSalary(html.css("div.cn strong", "text").toString());
            jobInfo.setSalaryMin(salary[0]);
            jobInfo.setSalaryMax(salary[1]);

            //获取发布时间
            String time = Jsoup.parse(html.css("p.ltype").regex("&nbsp;(.*?)发布").toString().substring(html.css("p.ltype").regex("&nbsp;(.*?)发布").toString().length()-5)).text();
            System.out.println("发布时间:"+time);
            jobInfo.setTime(time);

            //把结果保存起来
            page.putField("jobInfo", jobInfo);
        }

  在写的过程中,会发现有些页面不符合一般标准的职业详情页,比如说有些网页会没有职位详情,发布日期等等,都是可能会遇见的情况,所以加上try catch捕获异常,不过也可以不添加,因为一般这样的职业主要是打广告的作用,比如说阿里巴巴的有些就是有些类似广告,没有职位,只是单纯的推荐这家公司,只有公司介绍等等,代码在如果没有try catch的话就会报错,这个方法就不会继续执行下去,会跳到下一个链接去爬取,也不会保存到数据库中,但是为了代码的健壮性还是加上了,还会出现数组越界的情况,这个也是因为有些职业详情网站的内容不是很标准。所以还是在部分代码上要添加try catch。

posted @ 2020-01-17 17:03  HEIYANG  阅读(193)  评论(0编辑  收藏  举报