上篇講到 想要獲取盡可能多的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數據~