zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    MAC 上找不到.bash_profile或者ect/profile该怎么办?
    iOS极光推送集成步骤
    排序算法
    iOS之内存管理浅谈
    iOS之多线程浅谈
    iOS之RunTime浅谈
    Hash算法初见
    webApi实现增删改查操作
    Python: sqlite3模块
    python3:iterable, iterator, generator,抽象基类, itertools的使用。
  • 原文地址:https://www.cnblogs.com/heiyang/p/12216930.html
Copyright © 2011-2022 走看看