今天需要用到行政区划的数据,之前爬取过,但是没有保留。
上各家API看了下,,都要收费或者key。。
好吧,,自己动手。。webmagic框架。
以下代码可以获取到所有的行政区划code和汉字。。这是一个list,,集合有了,,json还远吗?
剩下的父子关系其实很好处理。。就是判断是否省市县,处理就好。
先贴获取区划的代码:
public class CityZoneSpider implements PageProcessor {
private final transient Logger logger = Logger.getLogger(CityZoneSpider.class);
// 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
@Override
public Site getSite() {
return site;
}
@Override
public void process(Page page) {
if (page.getUrl().toString()
.matches("http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/")) {
/*System.out.println(page.getHtml()
.xpath("//ul[@class='center_list_contlist']").links().all().toString());*/
String newUrl = page.getHtml()
.xpath("//ul[@class='center_list_contlist']").links()
.all().get(0);
page.addTargetRequest(newUrl);
return;
}
List<Selectable> contentList = page.getHtml()
.xpath("//div[@class='TRS_PreAppend']/p/b/span").nodes();
contentList.addAll(page.getHtml()
.xpath("//div[@class='TRS_PreAppend']/p/span").nodes());
List<Zone> list = new ArrayList<>();
for (int i = 0; i < contentList.size(); i++) {
Selectable node = contentList.get(i);
String innerHtml = node.toString();
//判断code开始
if(!innerHtml.contains("lang=\"EN-US\"")){
continue;
}
String code = node.xpath("//span[@lang='EN-US']/text()").get().replace(" ", "");
String text = contentList.get(i+1).xpath("//span/text()").get();
list.add(new Zone(code,text));
//System.out.println(code +":"+text);
//跳过已处理的文本
i++;
}
page.putField("data", list);
logger.info("==> zone list size is :"+ list.size());
}
public static void main(String[] args) {
Spider.create(new CityZoneSpider())
// 从"https://github.com/code4craft"开始抓
.addUrl("http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/")
//.addPipeline(new ZonePipeline())
// 开启1个线程抓取
.thread(1)
// 启动爬虫
.run();
}
}
再贴下 处理省市县关系的代码
for(Zone z:list){
if(z.getCode().endsWith("0000")){
z.setParentId("0");
}else if(!z.getCode().endsWith("0000") && z.getCode().endsWith("00")){
z.setParentId(z.getCode().substring(0,2)+"0000");
}else{
z.setParentId(z.getCode().substring(0,4)+"00");
}
}