先来看一下代码:
/** * 通过Lac和cell_id查询经度(longitude)和纬度(latitude) * @param lac LAC号码 * @param cell_id cell_id号码 * @return Map:key -- 经度:longitude * 纬度:latitude * 地址: address */ public Map queryLongitudeAndLatitude(String lac,String cell_id) throws IOException{ Map<String,String> map = new HashMap<String,String>(); // 生成一个httpclient对象,模拟http请求 CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://www.cellid.cn/m/cidInfo.php?lac=" + lac + "&cell_id=" + cell_id + "&hex=false&flag=2262433451"); httpPost.setHeader("Accept:","*/*"); httpPost.setHeader("Accept-Encoding:","gzip, deflate"); httpPost.setHeader("Connection:","keep-alive"); httpPost.setHeader("Origin:","http://www.cellid.cn"); httpPost.setHeader("Referer:","http://www.cellid.cn/m/index.php");//Referer:很多网站如果我们直接访问可能会报非法访问,一般就是这个参数不存在引起的 HttpResponse response = httpclient.execute(httpPost); InputStream fis = response.getEntity().getContent(); //将内容写到StringBuilder中 BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } fis.close(); //地址被<br>标签包裹 int a = sb.indexOf("<br>") + "<br>".length(); int b = sb.lastIndexOf("<br>"); //经纬度被coord和addressInfo包裹 int c = sb.indexOf("coord=") + "coord=".length(); int d = sb.lastIndexOf("&addressInfo"); //获取经纬度 String jw = sb.substring(c,d); String address = sb.substring(a,b); //地址 String latitude = jw.substring(0,jw.indexOf(",")); //纬度 String longitude = jw.substring(jw.indexOf(",") + 1); //经度 map.put("address",address); map.put("latitude",latitude); map.put("longitude",longitude); return map; }
对代码中的内容进行一些解释:
因为做的是基站定位相关的内容,所以访问的是我所需要的网站。
httpPost.setHeader("xxxx");
这里设置要根据我们具体要访问哪个网站来设置,F12开发者模式。抓取到请求信息,然后就可以根据请求信息里的内容来进行设置了。
代码中一直到fis.close();这一部分算是全部获取到了返回的response中的entity,接下来就可以按需求来获取值了。我这里需要地址及经纬度,所以获取了这部分的值。
看一下response.entity中有些什么,这样或许会更清楚我上面的代码是在做什么:
sb = {StringBuilder@1808}"基站:34860,62041<br>云南省西双版纳傣族自治州景洪市锦绣路<br><a href='../location.php?lac=34860&cellid=62041&coord=22.01436,100.752683&addressInfo=云南省西双版纳傣族自治州景洪市锦绣路' target='_blank'>(查看地图</a>)"