我编写了一个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);
}
如果报废出错,我还希望收到错误邮件。请帮忙
答案 0 :(得分:0)
有很多方法可以实现这一目标。 Cron jobs例如:这些可以在每天(或每小时或每个月)的给定时间运行。但是,当涉及到失败的Cron作业的错误报告时,这需要在* nix空间中获得一些更高级的技术诀窍,这可能是您现在对解决不感兴趣。
Java本身有许多调度程序框架,可以定期执行您的作业。 Quartz Scheduler就是一个。虽然我还没有尝试过,Obsidian Scheduler是我的一些同事最近带给我作为Quartz的替代品的另一个。但这些名字都只是轶事,它们的可行性随着时间的推移会发生变化。可以这么说,这些东西已经为您创建,可以用作第三方库,您应该研究它们以确定哪种方法最适合您。
答案 1 :(得分:0)
在crontab下运行。
至于错误电子邮件......这是一个完全不同的问题,取决于你。