NiceLeeのBlog 用爱发电 bilibili~

Java 爬虫练习-历史上的今天

2018-11-24
nIceLee

阅读:


最近碰到了一个很有趣的玩意儿-历史上的今天,于是想尝试做一下,贴一下思路和大概步骤。

思路

  • 因为自身并没有相应的数据,所以只能到其他地方去爬。这里有两种解决方案:
    • 先爬出来,自己建立一个数据库,然后基于这个来做接口。优点是只需要爬一次,而且一年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:


内容
隐藏