一直想得到成都市的商品房交易数据来进行一些分析。但苦于没有数据来源。这个想法一直被搁浅在那儿。
偶然的机会知道成都市每日的成交量在发布当天的成效数据。

就突发奇想想做一个页面抓取工具,能将每天的成交数据统计分析。可以该网站并不提供历史数据的查询,很是郁闷。
不过偶然的机会又发现另一个网站已经提供了部分历史数据的统计:
虽然通过页面的按钮只能找到10个可用的页面,但通过改变url中的page参数,我们可以找到最多75面的有效数据。
找到数据的来源了,接下来的问题就是如何从页面中抓取到想要的数据了。
这是查看到的相关的页面结构:
想要的信息有两个:1.日期 2.成交套数
一开始我想到的是将页面用DOM解析出来,然后通过xpath来找到想要的数据。
放弃这种的原因有:
- 并不是所有的网页都采用的是XHtml,很可能会解析出错。
- 利用现有大多支持XPath,查找HTML的框架都需要先做额外的工作将网页保存起来,才能进行解析,过于麻烦。
在花了些时间后,google到了jsoup这个目前非常流行的parser。
虽然不支持xpath,但它支持类似于jquery的selector来选取内容。而且可以直接通过url来解析网页。
以下是得用jsoup的代码:
public class GetHouseStatistics {
public static void main(String[] args) throws Exception {
String url = "http://newhouse.cd.soufun.com/house/web/newhouse_news_more.php?type=12193&page=";
FileWriter writer = new FileWriter(new File("house.data"));
for (int i = 1; i < 75; i++) {
Document doc = Jsoup.connect(url + i).timeout(9000).get();
Elements me = doc.select("[title$=套]");
System.out.println(me.html());
writer.append(me.html()+"\n");
}
writer.close();
}
}
以下是运行得到的结果保存成一个csv文件:
市区5月17日商品住宅成交158套 成都市区5月15日商品住宅成交41套 [成都房地产成交量]市区5月11日商品住宅成交182套 [成都房地产成交量]市区5月10日商品住宅成交183套 [成都房地产成交量]市区5月9日商品住宅成交163套 [成都房地产成交量]市区5月8日商品住宅成交53套 [成都房地产成交量]市区5月7日商品住宅成交44套 [成都房地产成交量]市区5月3日商品住宅成交171套 [成都房地产成交量]市区5月2日商品住宅成交31套 [成都房地产成交量]市区5月1日商品住宅成交31套 [成都房地产成交量]市区4月30日商品住宅成交85套 [成都房地产成交量]市区4月29日商品住宅成交219套 [成都房地产成交量]市区4月28日商品住宅成交230套 [成都房地产成交量]市区4月27日商品住宅成交170套 [成都房地产成交量]市区4月25日商品住宅成交92套 [成都房地产成交量]市区4月26日商品住宅成交104套
......
现在需要将日期和成交套数从文件中提取出来生成新的csv文件。
下面是代码:
public class Data2CVS {
public static void main(String[] args) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("house.data")));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File("house.cvs")));
int year = 2011;
String lineData;
while ((lineData = bufferedReader.readLine()) != null) {
Pattern p = Pattern.compile("\\d+月\\d+日");
Matcher m = p.matcher(lineData);
while (m.find()) {
String date = m.group().trim();
bufferedWriter.append(year+"年"+date);
bufferedWriter.append("\t");
if(date.equals("01月01日")||date.equals("1月1日")){
year--;
}
}
p = Pattern.compile("\\d+套");
m = p.matcher(lineData);
while (m.find()) {
String date = m.group().replace("套", "");
bufferedWriter.append(date);
bufferedWriter.append("\n");
}
}
bufferedReader.close();
bufferedWriter.close();
}
}
运行得到的新的CSV文件为:
2011年5月17日 158 2011年5月15日 41 2011年5月11日 182 2011年5月10日 183 2011年5月9日 163 2011年5月8日 53 2011年5月7日 44 2011年5月3日 171 2011年5月2日 31 2011年5月1日 31 2011年4月30日 85 2011年4月29日 219 2011年4月28日 230 2011年4月27日 170 2011年4月25日 92 2011年4月26日 104 2011年4月24日 41 2011年4月23日 62
得到CSV文件,就可以很方便的利用各种工具来生成图表了。以下是利用WPS报表生成的bar chart:

本文介绍了一种使用Java和jsoup库从特定网站抓取成都市商品房交易数据的方法,并展示了如何解析网页内容、提取关键信息并将其转换为CSV格式。

被折叠的 条评论
为什么被折叠?



