上篇讲到 想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字 那么这些关键字如何得来呢? 本人使用的方法是通过一些网站来获取这些关键词 http://poi.mapbar.com/这个网站有全国各地的POI数据 对各个城市的POI数据都有归类 我便是从这个网站上面获取了上海市的各个类别的关键词 比如上海市所有的门牌号码 公路名称 地铁名称等等 下面介绍如何获取这些信息
和获取百度POI数据所用的方法一样,都是通过分析这个网站的url然后替换其中的参数获取不同的数据 这个网站的数据分列在不同的类别中
每一个类别都对应一个url 这个可以通过查看网页源码查看
点击对应的url地址就可查看该类别包含的数据 比如查看上海所有中餐馆的名称
输入url http://poi.mapbar.com/shanghai/110/ 就可以看到所有中餐馆数据
当然 这些数据都是分页显示 对url稍作修改就能分页的形式查看数据 http://poi.mapbar.com/shanghai/110_1/ 表示中餐馆数据中的第一页数据 有的数据有多页 有的数据仅有一页 这些餐馆名称便可以当作在百度地图中搜索的关键词 通过程序下载这些网页再借助正则表达式便能够将每个关键词保存下来 要想让程序自动完成整个操作 首先要获取所有类别及其对应的关键词 这个可以通过将网页的html代码下来 自己创建一个网页 再引入jquery 借助jquery强大的选择器 将其中<a>标签的href属性给选取出来
以下是本人获取的所有类别及其url
有了这些数据 那么就可通过程序来完成所有关键词的获取了 以下是程序源码
class Program { static void Main(string[] args) { string hrefInfo = File.ReadAllText(@"C:\Users\Administartor\Desktop\href.txt",Encoding.Default); List<string> list = hrefInfo.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).ToList(); DataTable dt = SqlHelper.ExecuteDataTable("select KWName,KWType from SHKW",CommandType.Text); List<string> kwList = new List<string>(); foreach (DataRow row in dt.Rows) { kwList.Add(row["KWName"].ToString()); } foreach (string href_item in list) { StringBuilder sb = new StringBuilder(); string[] href_item_arr = href_item.Split(‘,‘); for (int i = 0; i < 1000; i++) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(href_item_arr[0].Substring(0,href_item_arr[0].Length-1)+"_"+(i+1)+"/"); request.Method = "GET"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); string restring = sr.ReadToEnd(); string[] strArr = restring.Split(new string[] { "<div class=\"sortC\">", "<div class=\"sortPage cl\" id=\"pageDiv\"" }, StringSplitOptions.None); Regex regex = new Regex("<a.*</a>"); MatchCollection collection = regex.Matches(strArr[1]); if (collection.Count == 0) break; foreach (var item in collection) { string[] dataArr = item.ToString().Split(new string[] { ">", "</a>" }, StringSplitOptions.RemoveEmptyEntries); sb.Append(dataArr[1] + ","); } } catch { break; } Console.WriteLine(href_item_arr[1] + " " + (i + 1)+" "+(list.IndexOf(href_item)+1)+"/"+list.Count); }//end for string[] kwArr = sb.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); DataTable dataDt = new DataTable(); dataDt.Columns.Add("KWName", typeof(string)); dataDt.Columns.Add("KWType", typeof(string)); dataDt.Columns.Add("SaveTime", typeof(DateTime)); string type=href_item_arr[1].Replace("/", "").Replace("\\", ""); foreach (string kw in kwArr) { if (kwList.Contains(kw)) continue; kwList.Add(kw); dataDt.Rows.Add(kw, type, DateTime.Now); } if (dataDt.Rows.Count != 0) { string res = ""; if (SqlHelper.DataTableToDB("SHKW", dataDt)) res = "成功"; else res = "失败"; Console.WriteLine(res + "写入KW" + " " + dataDt.Rows.Count + "个"); } else { Console.WriteLine(type+" 无数据"); } } Console.WriteLine("OK"); Console.ReadKey(); } }
查看数据库保存的关键词的数据
select * from SHKW
select count(*) from SHKW
有了这一百万条关键词的信息 下一步就可以构建获取百度地图POI数据的url了 下篇接着讲解如何获取百度地图的POI数据~