哪位大神能帮忙解决一下java.lang.IncompatibleClassChangeError: null

qq_41532992 2019-01-18 09:51:45
package com.itheima.utils;

import com.itheima.domain.JobInfo;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;
@Component
public class JobProcessor implements PageProcessor {
// 解析页面(PageProcesser)
public void process(Page page) {
// String html = page.getHtml().toString();
// System.out.println(html);
// 返回div的list
List<Selectable> list = page.getHtml().css("div#resultList>div.el").nodes();
// 判断列表页
if(list.size()>0){
// 将url存放到Request对象,用在Scheduler队列中,循环抽取详情页的信息(当前列表页的信息)
for (Selectable selectable : list) {
String url = selectable.links().toString();
page.addTargetRequest(url);
}
// 分页(下一页的url)
List<String> nextPageUrl = page.getHtml().css("div.p_in>ul>li.bk").nodes().get(1).links().all();
page.addTargetRequests(nextPageUrl);
}
// 判断详情页
else{
parseDetailHtml(page);
}
}


// 解析详情页
private void parseDetailHtml(Page page) {
JobInfo jobInfo = new JobInfo();
/**薪资(2-2.5万/月)*/
String salary = page.getHtml().css("div.cn strong", "text").toString();
if(StringUtils.isNoneBlank(salary)){
jobInfo.setSalaryMin(MathSalary.getSalary(salary)[0]);
jobInfo.setSalaryMax(MathSalary.getSalary(salary)[1]);
/**公司名称*/
jobInfo.setCompanyName(page.getHtml().css("div.cn p.cname a","text").toString());
/**公司地址:注意如果文本中出现html标签,获取不到,可以使用jsoup*/
List<Selectable> list = page.getHtml().css("div.tBorderTop_box div.bmsg p.fp").nodes();
if(list.size()==3){
jobInfo.setCompanyAddr(Jsoup.parse(page.getHtml().css("div.bmsg p.fp").nodes().get(2).toString()).text());
}
if(list.size()==2){
jobInfo.setCompanyAddr(Jsoup.parse(page.getHtml().css("div.bmsg p.fp").nodes().get(1).toString()).text());
}
/**公司信息*/
jobInfo.setCompanyInfo(Jsoup.parse(page.getHtml().css("div.tmsg").toString()).text());
/**职位名称*/
jobInfo.setJobName(page.getHtml().css("div.cn h1","text").toString());
/**职位地址*/
// 上海-徐汇区 | 5-7年经验 | 本科 | 招1人 | 01-14发布
String str = Jsoup.parse(page.getHtml().css("div.cn p.msg").toString()).text();
jobInfo.setJobAddr(str.substring(0,str.indexOf("|")));
/**职位信息*/
jobInfo.setJobInfo(Jsoup.parse(page.getHtml().css("div.bmsg").toString()).text());
/**详情页的url*/
jobInfo.setUrl(page.getUrl().toString());
/**时间*/
jobInfo.setTime(str.substring(str.indexOf("发布")-5,str.indexOf("发布")));
// 将JobInfo存放到Pipeline
page.putField("jobInfo",jobInfo);
}

}

// 用来设置参数
/**
* Site.me()可以对爬虫进行一些参数配置,包括编码、超时时间、重试时间、重试次数等。在这里我们先简单设置一下:重试次数为3次,重试时间为3秒。
*/
Site site = Site.me()
.setCharset("GBK") // 设置网站的编码集
.setTimeOut(10*1000) // 设置超时时间 单位是毫秒
.setRetrySleepTime(3*1000) // 设置重试时间,单位是毫秒,表示如果程序断开连接,3秒后再去访问服务器
.setRetryTimes(3) // 设置重试次数,3表示只能重复尝试连接服务器3次
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2595.400 QQBrowser/9.6.10872.400");;
public Site getSite() {
return site;
}

// 初始化的url
public 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°reefrom=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=";

@Autowired
SpringDataJpaPipeline springDataJpaPipeline;

// 启动爬虫(任务调度)(类似HttpClient,用来做下载页面的操作)
@Scheduled(initialDelay = 1000,fixedDelay = 2*60*60*1000)
public void startSpider() {
Spider spider = Spider.create(new JobProcessor()) // 创建爬虫类
.addUrl(url)// 添加初始url'
.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000000))) // 添加布隆过滤器,10000000表示最多对10000000的数据做重复的判断,数值越高,越会出现漏判的可能(之前不重复,你判定重复)
.addPipeline(springDataJpaPipeline)// 添加自定义的Pipeline
.thread(200); // 开启多线程服务
// 启动爬虫
spider.run();
}
}



然后出现了这样的异常:
java.lang.IncompatibleClassChangeError: null
at us.codecraft.webmagic.scheduler.DuplicateRemovedScheduler.push(DuplicateRemovedScheduler.java:35) ~[classes/:na]
at us.codecraft.webmagic.Spider.setScheduler(Spider.java:197) ~[classes/:na]
at com.itheima.utils.JobProcessor.startSpider(JobProcessor.java:106) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_131]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_131]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_131]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
...全文
333 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧