java利用爬虫技术抓取(省、市(区号\邮编)、县)数据
近期项目须要用到 城市的地址信息,但从网上下载的xml数据没有几个是最新的地址信息.....数据太老,导致有些地区不全。所以才想到天气预报官网特定有最新最全的数据。贴出代码,希望能给有相同困惑的朋友。降低一些时间。
/**
* @param var 城市名称
* @return string数组。0表示邮编 1表示区号
*/
@SuppressWarnings("deprecation")
private String[] getZipCode(String var) {
String[] code = new String[2];
String zipCode_S = "邮编:";
String zipCode_E = " ";
String qhCode_S = "区号:";
String qhCode_E = "</td>";
String encode = URLEncoder.encode(var);
try {
URL url = new URL("http://www.ip138.com/post/search.asp? area="
+ encode + "&action=area2zone");
BufferedReader br = new BufferedReader(new InputStreamReader(
url.openStream(), "GBK"));
for (String line; (line = br.readLine()) != null;) {
int zipNum = line.indexOf(zipCode_S);
if (zipNum > 1) {
String str = line.substring(zipNum + zipCode_S.length());
str = str.substring(0, str.indexOf(zipCode_E));
code[0] = str;
}
int qhNum = line.indexOf(qhCode_S);
if(qhNum > 1)
{
String str = line.substring(qhNum + qhCode_S.length());
str = str.substring(0, str.indexOf(qhCode_E));
code[1] = str;
break;
}
}
} catch (Exception e) {
System.out.println(var +"\t错误"+e.toString());
}
return code;
} /**
* 主程序
* @throws Exception
*/
@Test
public void main() throws Exception
{
//1:获取全部省份
TreeMap<String,String> provincesBuffer = getAddressInfo("http://www.weather.com.cn//data/city3jdata/china.html");
Element prcEle = DocumentHelper.createElement("Provinces"); //2:依据省份获取城市
Element citysEle = DocumentHelper.createElement("Citys"); //3:依据省份城市获取区、县
Element distEle = DocumentHelper.createElement("Districts");
int p = 1;
int c = 1;
int d = 1;
for(Entry<String, String> prc : provincesBuffer.entrySet())
{
Element province = DocumentHelper.createElement("Province");
province.addAttribute("ID",""+(p)).addAttribute("ProvinceName", prc.getValue()).addText(prc.getValue());
//获取邮政编号
TreeMap<String,String> cityBuffer = getAddressInfo("http://www.weather.com.cn/data/city3jdata/provshi/"+prc.getKey()+".html");
for(Entry<String, String> citys : cityBuffer.entrySet())
{
Element city = DocumentHelper.createElement("City");
String[] zipCode = getZipCode(citys.getValue());
if(zipCode[0]==null||zipCode[1]==null)
System.out.println("缺少"+citys.getValue()+"邮政或区号!");
city.addAttribute("ID", ""+c).addAttribute("CityName", citys.getValue()).addAttribute("PID",p+"").addAttribute("ZipCode", zipCode[0]).addAttribute("AreaCode", zipCode[1]).addText(citys.getValue());
TreeMap<String, String> distsBuffer = getAddressInfo("http://www.weather.com.cn/data/city3jdata/station/"+prc.getKey()+""+citys.getKey()+".html");
for(Entry<String, String> dists : distsBuffer.entrySet())
{
String value = dists.getValue();
if(value.equals(citys.getValue()))
continue; Element district = DocumentHelper.createElement("District");
district.addAttribute("ID",""+(d++)).addAttribute("DistrictName", dists.getValue()).addAttribute("CID", c+"").addText(dists.getValue());
distEle.add(district);
}
citysEle.add(city);
c++;
}
prcEle.add(province);
p++;
}
//4:保存到本地
saveInf("f:\\Provinces.xml",prcEle);
saveInf("f:\\Citys.xml",citysEle);
saveInf("f:\\Districts.xml",distEle);
} /** 保存xml
* @param savePath xml保存路径
* @param varEle 根元素
*/
private void saveInf(String savePath, Element varEle) {
Document varDoc = DocumentHelper.createDocument();
varDoc.add(varEle);
try {
XMLWriter xmlwri = new XMLWriter(new FileOutputStream(new File(savePath)), new OutputFormat("\t", true, "UTF-8"));
xmlwri.write(varDoc);
xmlwri.close();
} catch (Exception e) {
System.out.println(savePath +"失败,原因例如以下");
throw new RuntimeException(e);
}
} /**
* 获取信息
* @param address url路径
* @return key :信息编号 value:信息名称
*/
private TreeMap<String, String> getAddressInfo(String address) {
TreeMap<String,String> china = new TreeMap<String, String>();
BufferedReader br = null;
String buffer = null;
try {
URL url = new URL(address);
br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
buffer = br.readLine();
} catch (Exception e) {
System.out.println("错误:"+e.getMessage());
}finally{
if(br != null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(buffer==null)
return china; buffer = buffer.replaceAll("\\{|\\}|\"","");
String[] splits = buffer.split(",");
for(String sp : splits)
{
String[] split = sp.split(":");
if(split!=null && split.length == 2)
china.put(split[0], split[1]);
else
System.out.println(address);
}
buffer = null;
return china;
}
java利用爬虫技术抓取(省、市(区号\邮编)、县)数据的更多相关文章
- java网络爬虫----------简单抓取慕课网首页数据
© 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...
- Java广度优先爬虫示例(抓取复旦新闻信息)
一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...
- 【JAVA系列】Google爬虫如何抓取JavaScript的?
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[JAVA系列]Google爬虫如何抓取Java ...
- Pyhton爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗
Pyhton爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗 零.致谢 感谢BOSS直聘相对权威的招聘信息,使本人有了这次比较有意思的研究之旅. 由于爬虫持续爬取 www.zhipin.com 网 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- 使用htmlparse爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- Golang分布式爬虫:抓取煎蛋文章|Redis/Mysql|56,961 篇文章
--- layout: post title: "Golang分布式爬虫:抓取煎蛋文章" date: 2017-04-15 author: hunterhug categories ...
- 使用htmlparser爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
随机推荐
- [转].net创建XML文件的两种方法
原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] 方法一:按照XML的结构一步一步的构建XML文档. 通过.Net FrameWork SDK中的命名空间&q ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---6
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- Scrapy笔记:CrawSpider中rules中的使用
scrapy.spiders.crawl.CrawlSpider类的使用 这个类比较适用于对网站爬取批量网页,相比于Spider类,CrawlSpider主要使用规则(rules)来提取链接 rule ...
- 【原创】Word2010 清除样式
使用场景 有时候我们在网页上面粘贴一些精华文章或者从去整理别人已经完成的word的时候,会发现它自带的格式,可能并不是我们所理想的格式,所以此时就不得不去重新编辑其格式,但是word里 ...
- 一、Ubuntu 简介
Ubuntu 是一个Linux 系统 Apt-Get apt-get 命令是一个强大的命令行工具,用于同 Ubuntu 的 Advanced Packaging Tool (APT) 一起执行诸如安装 ...
- 数据库索引实现原理—B_TREE
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B_TREE.B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据:相反 ...
- CSU 1779: 错误的算法【矩阵/模拟】
Description 有道题目是这样的: 输入一个 n 行 m 列网格,找一个格子,使得它所在的行和列中所有格子的数之和最大.如果答 案不唯一,输出任意解即可.比如,在下面的例子中,最优解是(1,3 ...
- Loj #6142. 「2017 山东三轮集训 Day6」A
link: https://loj.ac/problem/6142 推完一波式子之后发现求的是:ΣC(N,i)^2, 其中i是偶数. 然后就可以卢卡斯乱搞了,分奇偶和之前的答案合并就好了233. #i ...
- Android Studio 中.android 文件夹移动默认位置
转自 开发工具打造: .android 文件夹移动默认位置 .android 文件夹是用来存放 avd 模拟器文件的文件夹. 因为默认是 C盘 的. 占用空间比较大.很不爽 将它移动到其它盘其实很简单 ...
- 灰度发布+A/B测试
一起需要提的还有灰度发布. 在方法论上都属于试错法. A/B测试就是上两个方案,部署后看效果.根据效果和一些结果参数决定采用哪个方案.灰度发布是切一部分业务使用新方案,看效果如何,是否有bug,会遇到 ...