如何自动化java程序

时间:2016-09-20 23:12:50

标签: java jsoup

我编写了一个java抓取程序,我希望自动化它在特定时间每天运行抓取。

这是代码

private static class DateObject{

        private Double taxes;
        private Double price;
        private Double htPrice;

        public DateObject(Double price, Double htPrice, Double taxes){
            this.taxes = taxes;
            this.price = price;
            this.htPrice = htPrice;
        }

        public Double getTaxes() {
            return taxes;
        }

        public Double getPrice() {
            return price;
        }

        public Double getHtPrice() {
            return htPrice;
        }
    }

    public static void main(String[] args) {

        Map<String, DateObject> prices = new TreeMap<String, DateObject>();
        File f = new File(System.getProperty("user.home") + "\\Desktop\\Test.xls");

        WritableWorkbook myexcel = null;

        try {

            myexcel = Workbook.createWorkbook(f);
            WritableSheet mysheet = myexcel.createSheet("AirFrance ", 0);

            Response response = Jsoup
                    .connect("http://www.airfrance.fr/vols/paris+tunis")
                    .userAgent("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36")
                    .method(Method.GET)
                    .timeout(2000)
                    .execute();

            Document doc = Jsoup
                    .connect("http://www.airfrance.fr/FR/fr/local/vols/getInstantFlexNewCalendar.do?idMonth=10&itineraryNumber=1")
                    .cookies(response.cookies())
                    .timeout(2000)
                    .userAgent("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36")
                    .referrer("http://www.airfrance.fr/vols/paris+tunis").get();

            JSONObject obj = (JSONObject) new JSONParser().parse(doc.text());

            JSONArray dates = (JSONArray) obj.get("days");

            JSONObject dateObject;

            for(Object o : dates){
                if ( o instanceof JSONObject ) {
                    dateObject = ((JSONObject)o);
                    prices.put(dateObject.get("dallasDate").toString(), new DateObject((Double)dateObject.get("price"), (Double)dateObject.get("HTprice"), (Double)dateObject.get("taxes")));
                }
            }

            addLabel(mysheet, 0, 0, "Date");
            addLabel(mysheet, 1, 0, "Prix [€]");
            addLabel(mysheet, 2, 0, "PrixHt [€]");
            addLabel(mysheet, 3, 0, "Taxes [€]");

            int rowIndex = 1;
            DateObject date;

            for (String key : prices.keySet()) {
                date = prices.get(key);
                addLabel(mysheet, 0, rowIndex, key);
                addLabel(mysheet, 1, rowIndex, ""+date.getPrice());
                addLabel(mysheet, 2, rowIndex, ""+date.getHtPrice());
                addLabel(mysheet, 3, rowIndex, ""+date.getTaxes());
                rowIndex++;
            }

        myexcel.write();

        System.out.println("Scraping finished without errors.");

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (WriteException e) {
            e.printStackTrace();
        } finally {
            try {
                myexcel.close();
            } catch (WriteException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void addLabel(WritableSheet sheet, int column, int row, String s)
            throws WriteException, RowsExceededException {
        Label label;
        label = new Label(column, row, s);
        sheet.addCell(label);
    }

如果报废出错,我还希望收到错误邮件。请帮忙

2 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一目标。 Cron jobs例如:这些可以在每天(或每小时或每个月)的给定时间运行。但是,当涉及到失败的Cron作业的错误报告时,这需要在* nix空间中获得一些更高级的技术诀窍,这可能是您现在对解决不感兴趣。

Java本身有许多调度程序框架,可以定期执行您的作业。 Quartz Scheduler就是一个。虽然我还没有尝试过,Obsidian Scheduler是我的一些同事最近带给我作为Quartz的替代品的另一个。但这些名字都只是轶事,它们的可行性随着时间的推移会发生变化。可以这么说,这些东西已经为您创建,可以用作第三方库,您应该研究它们以确定哪种方法最适合您。

答案 1 :(得分:0)

crontab下运行。

至于错误电子邮件......这是一个完全不同的问题,取决于你。