最近碰到了一个很有趣的玩意儿-历史上的今天,于是想尝试做一下,贴一下思路和大概步骤。
思路
- 因为自身并没有相应的数据,所以只能到其他地方去爬。这里有两种解决方案:
- 先爬出来,自己建立一个数据库,然后基于这个来做接口。优点是只需要爬一次,而且一年366天数据量也不大,适合本地保存。但缺点是后续不更新的话,数据会老旧过时。当然,基于我们现在要做的事情,这也不是什么大问题。
- 直接做接口,每次收到请求都访问数据源,然后解析成想要的格式。这里缺点是依赖数据源,如果数据源不再提供服务或者网页样式变更,需要再次重新匹配;同时访问量大的话影响不好。
- 这里只是打算练习,没有进一步的打算,故而采用了第二种方法。
寻找数据源
搜索了一下,关键词历史上的今天
,发现http://www.lssdjt.com/就挺好的。
说它对于爬虫挺友好,一是网页结构简单,内容罗列整齐,非常容易抓取:
二是对指定的日期很容易找到对应网址,如图:
建立接口
不多说,直接上码:
@RestController
@RequestMapping("/historytoday")
public class HistoryOnTodayController {
@RequestMapping(value = "/{mon}/{day}")
public List<HashMap<String, String>> home( @PathVariable int mon, @PathVariable int day) {
List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
//TODO 获取内容
HashMap<String, String> day_event = new HashMap<>();
day_event.put("date", "2018-11-24");
day_event.put("event", "好吧,我也不知道发生了什么");
list.add(day_event);
return list;
}
}
效果如图,ok:
解析数据源
不多说,直接上码:
@RequestMapping(value = "/{mon}/{day}")
public List<HashMap<String, String>> home( @PathVariable int mon, @PathVariable int day) {
List<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
//编辑内容
String url = String.format("http://www.lssdjt.com/%d/%d/", mon, day);
try {
Document doc = Jsoup.connect(url)
.header("Accept", "text/html")
.header("Accept-Language", "zh-CN,zh;q=0.8")
.header("Connection", "keep-alive")
.userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0")
.timeout(5000)
.get();
Elements eles = doc.select(".main .list li");
for( Element dayEle : eles) {
HashMap<String, String> day_event = new HashMap<>();
day_event.put("date", dayEle.selectFirst("em").text());
day_event.put("event", dayEle.selectFirst("i").text());
list.add(day_event);
}
} catch (Exception e) {
HashMap<String, String> day_event = new HashMap<>();
day_event.put("error", e.toString());
list.add(day_event);
}
return list;
}
效果如图,ok: