importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;/*** 全国省市县镇村数据爬取
*@authorliushaofeng
* @date 2015-10-11 上午12:19:39
*@version1.0.0*/
public classJsoupTest
{private static Map cssMap = new HashMap();private static BufferedWriter bufferedWriter = null;static{
cssMap.put(1, "provincetr");//省
cssMap.put(2, "citytr");//市
cssMap.put(3, "countytr");//县
cssMap.put(4, "towntr");//镇
cssMap.put(5, "villagetr");//村
}public static void main(String[] args) throwsIOException
{int level = 1;
initFile();//获取全国各个省级信息
Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/");
Elements rowProvince= connect.select("tr." +cssMap.get(level));for (Element provinceElement : rowProvince)//遍历每一行的省份城市
{
Elements select= provinceElement.select("a");for (Element province : select)//每一个省份(四川省)
{
parseNextLevel(province, level+ 1);
}
}
closeStream();
}private static voidinitFile()
{try{
bufferedWriter= new BufferedWriter(new FileWriter(new File("d:\\CityInfo.txt"), true));
}catch(IOException e)
{
e.printStackTrace();
}
}private static voidcloseStream()
{if (bufferedWriter != null)
{try{
bufferedWriter.close();
}catch(IOException e)
{
e.printStackTrace();
}
bufferedWriter= null;
}
}private static void parseNextLevel(Element parentElement, int level) throwsIOException
{try{
Thread.sleep(500);//睡眠一下,否则可能出现各种错误状态码
} catch(InterruptedException e)
{
e.printStackTrace();
}
Document doc= connect(parentElement.attr("abs:href"));if (doc != null)
{
Elements newsHeadlines= doc.select("tr." + cssMap.get(level));//
//获取表格的一行数据
for(Element element : newsHeadlines)
{
printInfo(element, level+ 1);
Elements select= element.select("a");//在递归调用的时候,这里是判断是否是村一级的数据,村一级的数据没有a标签
if (select.size() != 0)
{
parseNextLevel(select.last(), level+ 1);
}
}
}
}/*** 写一行数据到数据文件中去
*@paramelement 爬取到的数据元素
*@paramlevel 城市级别*/
private static void printInfo(Element element, intlevel)
{try{
bufferedWriter.write(element.select("td").last().text() + "{" + level + "}["
+ element.select("td").first().text() + "]");
bufferedWriter.newLine();
bufferedWriter.flush();
}catch(IOException e)
{
e.printStackTrace();
}
}private staticDocument connect(String url)
{if (url == null ||url.isEmpty())
{throw new IllegalArgumentException("The input url('" + url + "') is invalid!");
}try{return Jsoup.connect(url).timeout(100 * 1000).get();
}catch(IOException e)
{
e.printStackTrace();return null;
}
}
}