标签:public exce img 联系 cat 项目 except cli 使用
java爬虫研招网 https://yz.chsi.com.cn/zsml/zyfx_search.jsp
https://gitee.com/aluruihua/auto-move
本次需求是爬到所有可以post提交的的最里面的页面的所有有关学校的专业的所有信息。关键字段是拟招人数和考试范围。我也是帮我一个同学爬出这些数据,放到web页面展示,由于他想看比如北京计算机专业的拟招人数和考试范围,他需要一个一个点进去看一下。这样非常浪费时间,非常麻烦。哈哈爬出来展示可能好点。主要是想练习一下简单线程池的使用。本次是一个单节点,多线程的数据爬取。不存在封ip的情况。
CyclicBarrier (栅栏)
任务库中的任务已经添加一些,可以直接启动,查看bi库中数据的插入。
public void begin() {
List<Task> tasks = dao.query(Task.class, Cnd.where("status", "=", 0));//使用nutz扫描任务库中状态为0的任务
if (tasks.size()==0){
logger.info("*********所有任务执行完毕*****************");
} else {
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(size);
CyclicBarrier cyclicBarrier = new CyclicBarrier(size);//开启栅栏
for (int i=0;i<size;i++){
Task task = null;
KaoyanSonThread kaoyanSonThread = null;
try {
//创建几个线程池,就将每个任务添加到线程池中
task = tasks.get(i);//当报null指针的时候,就是任务快完的时候,所以使用try..catch...
}catch (Exception e){
logger.info("线程任务即将结束。。。。。。");
}
try {
kaoyanSonThread= new KaoyanSonThread(cyclicBarrier,dao,task);//这个类是线程类不受spring管理,通过构造注入,实现runable接口,具体看项目中代码。
pool.execute(kaoyanSonThread);
}catch (Exception e){
logger.error("线程池错误。。。。。");
}
}
//结束线程池
pool.shutdown();
}
}
@Component
@PropertySource(value = "classpath:run.properties",encoding = "UTF-8")
public class CronScheduler implements ApplicationRunner {
@Autowired
private Scheduler scheduler;
@Value("${task-cron}")
String cron;//通过配置文件获取自定义定时时间
@Override
public void run(ApplicationArguments args) throws Exception {
//jobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("cronJob").build();//定时器执行的方法HelloJob.class
//cronTrigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
scheduler.start();//启动定时任务
}
}
打开run.properties文件,修改时间和线程数。本次配置为十秒钟,读3个线程。
标签:public exce img 联系 cat 项目 except cli 使用
原文地址:https://www.cnblogs.com/luruihua/p/11184150.html