首页 > 编程语言 > 详细

java爬虫练习|webmagic爬取前程无忧职位信息

时间:2020-07-20 17:22:46      阅读:185      评论:0      收藏:0      [点我收藏+]

java爬虫学习webmagic爬取前程无忧职位信息遇到的一些问题记录一下

1.使用爬取页面跑出"TLSv1.3"不支持异常

由于webmagic作者长期没有发布0.74版本,所以只能手动解决

下载webmagic-core源码,去除"TLSv1.3",在忽视测试在install,即可爬取页面

技术分享图片

 

 

 2.问题如下

技术分享图片

3.因为之前用的1.7的编译版本,改成1.8导致idea 版本报错:Error:java: Compilation failed: internal java compiler error 解决办法

报错原因:
项目中Java版本不一致,可以查看项目中的jdk配置
1、查看项目的jdk(Ctrl+Alt+shift+S)
File ->Project Structure->Project Settings ->Project


2、查看工程的jdk(Ctrl+Alt+shift+S)
File ->Project Structure->Project Settings -> Modules -> (需要修改的工程名称) -> Sources ->


3、查看idea中Java配置

File-->Other Settings-->Default Settings-->Compiler-->Java Compiler


如果出现的Choose Module框中是空白,无法修改Target bytecode version.则:

选中项目,右击选择Maven-->Reimport, 然后再次编译,问题解决。

爬取前程无忧职位使用的是webmagic,项目搭建使用的是springboot,springdatajpa,当然也可以使用mybatis

主要代码如下

1.JobInfoServiceImpl 业务实现

@Service
public class JobInfoServiceImpl implements JobInfoService {

    @Autowired
    private JobInfoDao jobInfoDao;


    @Override
    @Transactional
    public void save(JobInfo jobInfo) {
        //先从数据库查询数据,根据发布日期查询和url查询
        JobInfo param = new JobInfo();
        param.setUrl(jobInfo.getUrl());
        param.setTime(jobInfo.getTime());
        List<JobInfo> list = this.findJobInfo(param);

        if (list.size() == 0) {
            //没有查询到数据则新增或者修改数据
           jobInfoDao.saveAndFlush(jobInfo);
        }
    }

    @Override
    public List<JobInfo> findJobInfo(JobInfo jobInfo) {
        Example example = Example.of(jobInfo);
        List<JobInfo> list = jobInfoDao.findAll(example);
        return list;
    }
}

2.JpaPipeline 实现爬取信息存储到数据库

@Component
public class JpaPipeline implements Pipeline {

    @Autowired
    private JobInfoService jobInfoService;

    @Override
    public void process(ResultItems resultItems, Task task) {
        JobInfo jobInfo = resultItems.get("jobInfo");
        if(jobInfo!=null){
            jobInfoService.save(jobInfo);
        }
    }
}

3.JobProcessor 页面爬取实现

@Component
public class JobProcessor implements PageProcessor {
    private  String url="https://search.51job.com/list/000000,000000,0000,01%252C32,9,99,java,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";

    @Override
    public void process(Page page) {
        //解析页面,获取招聘信息详情的url地址
        List<Selectable> list = page.getHtml().css("div#resultList div.el").nodes();


        //判断获取到的集合是否为空
        if (list.size() == 0) {
            // 如果为空,表示这是招聘详情页,解析页面,获取招聘详情信息,保存数据
            this.saveJobInfo(page);

        } else {
            //如果不为空,表示这是列表页,解析出详情页的url地址,放到任务队列中
            for (Selectable selectable : list) {
                //获取url地址
                String jobInfoUrl = selectable.links().toString();
                //把获取到的url地址放到任务队列中
                page.addTargetRequest(jobInfoUrl);
            }

            //获取下一页的url
            String bkUrl = page.getHtml().css("div.p_in li.bk").nodes().get(1).links().toString();
            //把url放到任务队列中
            page.addTargetRequest(bkUrl);

        }
    }
    //解析页面,获取招聘详情信息,保存数据
    private void saveJobInfo(Page page) {
        //创建招聘详情对象
        JobInfo jobInfo  = new JobInfo();

        //解析页面
        Html html = page.getHtml();

//        //获取数据,封装到对象中
        jobInfo.setCompanyName(html.css("div.cn p.cname a","text").toString());
        jobInfo.setCompanyAddr(Jsoup.parse(html.css("div.bmsg").nodes().get(1).toString()).text());
        jobInfo.setCompanyInfo(Jsoup.parse(html.css("div.tmsg").toString()).text());
        jobInfo.setJobName(html.css("div.cn h1","text").toString());

        String[] msgs = html.css("div.tHeader div.cn p.msg", "title").toString().split("\\|");
        jobInfo.setJobAddr(msgs[0].trim());

        jobInfo.setJobInfo(Jsoup.parse(html.css("div.job_msg").toString()).text());
        jobInfo.setUrl(page.getUrl().toString());

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

        //获取发布时间
        //处理发布时间
        String time = null;
        for (String msg : msgs) {
            if (msg.contains("发布")) {
                time = msg.trim().substring(0, msg.length() - 2).trim();
                break;
            }
        }
        if (time == null) {
            time = "未知";
        }
        jobInfo.setTime(time);

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

    private Site  site = Site.me()
            .setCharset("gbk")//设置编码
            .setTimeOut(10 * 1000)//设置超时时间
            .setRetrySleepTime(3000)//设置重试的间隔时间
            .setRetryTimes(3);//设置重试的次数

    @Autowired
    private JpaPipeline jpaPipeline;

    @Override
    public Site getSite() {
        return site;
    }
    //initialDelay 任务启动后多久执行方法 fixedDelay 间隔多久再执行方法
    @Scheduled(initialDelay = 1000,fixedDelay = 100*1000)
    public void process(){
        Spider.create(new JobProcessor())
                .addUrl(url)
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(100000)))
                .thread(5)
                .addPipeline(jpaPipeline)
                .run();
    }
}

 

 

 

其他接口和pojo,工具类自行查找

 

解决bug即可运行得到信息

技术分享图片

 

java爬虫练习|webmagic爬取前程无忧职位信息

原文:https://www.cnblogs.com/snax/p/13345458.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!