从高德地图大批量扒取数据,并写入excel

首先,源代码下载地址:http://down.51cto.com/data/2270088
然后,如果有问题,或者是积分不够可以发送邮件到我的邮箱[email protected],我可以把源程序分享给大家,如果对用google抓取接口不熟悉的话,也可以直接找我,我的手机号码是:15656098064,很高兴能和各位同行分享,如果是打电话要我上厕所,我可以要骂人的呦~。 
最后,直接上代码。

package com.iwant.download2geodata;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import javax.naming.InitialContext;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.iwant.download2geodata.data.ShopInfo;
import com.iwant.download2geodata.data.ShopList;
import com.iwant.download2geodata.data.TemplateData;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;

/**
 * @Description: 获取高德所有数据
 * @author: whsgzcy
 * @date: 2016-12-17 下午1:04:31 首先是从高德copy一个链接,只要修改pagernum参数即可拼接成新的链接
 *        抓取方式较原始,但可维护性高
 */
public class GeoGetDataThread extends Thread {

    public int pagernum = 1;// 跳转到下一页参数
    public String murl = "http://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=";    
    public String nurl = "&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&"
            + "div=PC1000&addr_poi_merge=true&is_classify=true&"
            + "city=321200&geoobj=119.848676%7C32.40107%7C119.93279%7C32.527222&keywords=%E7%94%B5%E5%8A%A8%E8%BD%A6";
    
    private HSSFWorkbook workbook = null; 
    private ShopList shopList = new ShopList();
    private List<ShopInfo> shopInfoList = new ArrayList<ShopInfo>();
    private List<TemplateData> templateDataList = new ArrayList<TemplateData>();
    
    /**
     * @Description: 根据pagernum跳转下一页
     * @author: whsgzcy
     * @date: 2016-12-17 下午1:17:08
     * @param pagernum
     */

    @Override
    public void run() {
        super.run();

//        // /先用本次文件进行测试
//        String encoding = "UTF-8";
//        StringBuilder builder = null;
//        try {
//            File file = new File("C:\\Users\\suzhe\\Desktop\\t.txt");
//            InputStreamReader read = new InputStreamReader(new FileInputStream(
//                    file), encoding);// 考虑到编码格式
//            BufferedReader bufferedReader = new BufferedReader(read);
//            builder = new StringBuilder();
//            for (String s = bufferedReader.readLine(); s != null; s = bufferedReader
//                    .readLine()) {
//                builder.append(s);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        if (null == builder) return;
//        jsonObject = JSONObject.fromObject(builder.toString());
        // 请求数据
        // 根据现有的数据量没有到list极限
        // 使用list存储数据,并在每次请求数据时休眠5秒,放缓线程以及防止扒取数据IP被封
        
        try {
            for(;;pagernum++){
                // 线程休眠
//                try {Thread.sleep(5000);} catch (InterruptedException e1) {e1.printStackTrace();}
                String url = murl+pagernum+nurl;
                System.out.println(url);
                JSONObject jsonObject = new JSONObject();
                jsonObject = HttpRequestUtil.getJsonObject(url);
                // 先打印count 判断是否有数据
                int count = jsonObject.getInt("count");
                if(0 == count) break;
                System.out.println("count = " + count);
                if (0 != count) {
                    JSONArray dataArray = jsonObject.getJSONArray("data");
                    JSONArray listArray = dataArray.getJSONObject(0).getJSONArray("list");
                    JSONObject line = null;
                    for (int i = 0; i < listArray.size(); i++) {
                        ShopInfo shopInfo = new ShopInfo();
                        TemplateData template = new TemplateData();
                        line = listArray.getJSONObject(i);
                        String name = line.getString("name");
                        shopInfo.setName(name);
                        String tel = line.getString("tel");
                        shopInfo.setTel(tel);
                        String address = line.getString("address");
                        shopInfo.setAddress(address);
                        String longitude = line.getString("longitude");
                        shopInfo.setLongitude(longitude);
                        String latitude = line.getString("latitude");
                        shopInfo.setLatitude(latitude);
                        JSONObject templateData = line.getJSONObject("templateData");
                        if (templateData.has("pic_info")) {
                            String pic_info = templateData.getString("pic_info");
                            template.setPic_info(pic_info);
                            templateDataList.add(template);
                            shopInfo.setTemplateData(templateDataList);
                        }else{
                            template.setPic_info("");
                            templateDataList.add(template);
                            shopInfo.setTemplateData(templateDataList);
                        }
                        shopInfoList.add(shopInfo);
                        System.out.println("数据读写中");
                    }
                    // 至此 第一页请求数据完成
                    shopList.setmShopInfoList(shopInfoList);
            }
                
                // 将数据写进Excel
                String title[] = {"店铺名称","店主","店铺简介","店铺电话","地址","经度","纬度","101充电桩","10有充电桩","照片","是否提供上门服务","图片链接"}; 
                createExcel("C:/Users/suzhe/Desktop/test2.xls","sheet1",title);
                    try {  
                        workbook = new HSSFWorkbook(new FileInputStream("C:/Users/suzhe/Desktop/test2.xls"));
                        //流  
                        FileOutputStream out = null;  
                        HSSFSheet sheet = workbook.getSheet("sheet1");
                        // 获取表格的总行数  
                        int rowCount = sheet.getLastRowNum() + 1; // 需要加一  
                        // 获取表头的列数  
                        int columnCount = sheet.getRow(0).getLastCellNum();  
                        Row row = sheet.createRow(rowCount);     //最新要添加的一行  
                        HSSFRow titleRow = sheet.getRow(0);  
                        
                        if(titleRow!=null){  
                                for(int i = 0; i < shopList.getmShopInfoList().size(); i++){
                                    
                                    row = sheet.createRow(i+1);     //最新要添加的一行  
                                    
                                    for(int k = 0; k < 12; k++){
                                    
                                        String name = shopInfoList.get(i).getName();
                                        Cell cellName = row.createCell(0);
                                        cellName.setCellValue(name);
                                        
                                        Cell cellMaster = row.createCell(1);                                
                                        cellMaster.setCellValue("无");
                                        Cell cellSay = row.createCell(2);
                                        cellSay.setCellValue("无");
                                        
                                        String tel = shopInfoList.get(i).getTel();
                                        Cell cellTel = row.createCell(3);
                                        cellTel.setCellValue(tel);
                                        
                                        String address = shopInfoList.get(i).getAddress();
                                        Cell cellAddress = row.createCell(4);
                                        cellAddress.setCellValue(address);
                                        
                                        String longitude = shopInfoList.get(i).getLongitude();
                                        Cell cellLongitude = row.createCell(5);
                                        cellLongitude.setCellValue(longitude);
                                        
                                        String latitude = shopInfoList.get(i).getLatitude();
                                        Cell cellLatitude = row.createCell(6);
                                        cellLatitude.setCellValue(latitude);
                                        
                                        Cell cellIsCharge = row.createCell(7);
                                        cellIsCharge.setCellValue("0");                                    
                                        Cell cellHaveCharge = row.createCell(8);
                                        cellHaveCharge.setCellValue("0");
                                        
                                        String pic_info = shopInfoList.get(i).getTemplateData().get(i).getPic_info();
                                        if(pic_info.equals("")){
                                            Cell cellPicUrl= row.createCell(11);
                                            cellPicUrl.setCellValue("");
                                            Cell cellPic = row.createCell(9);
                                            cellPic.setCellValue("");
                                        }else{
                                            Cell cellPicUrl= row.createCell(11);
                                            cellPicUrl.setCellValue(pic_info);
                                            Cell cellPic = row.createCell(9);
                                            cellPic.setCellValue("taizhou/"+(i+1)+".jpg");
                                        }
                                        
                                        Cell cellHome = row.createCell(10);
                                        cellHome.setCellValue("暂不提供上门服务");    
                                    }
                                }
                        }  
                        out = new FileOutputStream("C:/Users/suzhe/Desktop/test2.xls");  
                        workbook.write(out);  
                    }  catch (Exception e) {  
                        e.printStackTrace();  
                    }  
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    
    public void writeToExcel(String fileDir,String sheetName){  
        //创建workbook  
        File file = new File(fileDir);  
        try {  
            workbook = new HSSFWorkbook(new FileInputStream(file));  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        //流  
        FileOutputStream out = null;  
        HSSFSheet sheet = workbook.getSheet(sheetName);  
        // 获取表格的总行数  
        int rowCount = sheet.getLastRowNum() + 1; // 需要加一  
        // 获取表头的列数  
        int columnCount = sheet.getRow(0).getLastCellNum();  
        try {  
            Row row = sheet.createRow(rowCount);     //最新要添加的一行  
            //通过反射获得object的字段,对应表头插入  
            // 获取该对象的class对象  
//            Class class_ = object.getClass();  
            // 获得表头行对象  
            HSSFRow titleRow = sheet.getRow(0);  
            if(titleRow!=null){  
                for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {  //遍历表头  
                    String title = titleRow.getCell(columnIndex).toString().trim().toString().trim();  
                    Cell cell1 = row.createCell(0);
                    cell1.setCellValue("111");
                    Cell cell2 = row.createCell(1);
                    cell2.setCellValue("222");
                    Cell cell3 = row.createCell(2);
                    cell3.setCellValue("333");
                }  
            }  
            out = new FileOutputStream(fileDir);  
            workbook.write(out);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {    
            try {    
                out.close();    
            } catch (IOException e) {    
                e.printStackTrace();  
            }    
        }    
    } 
      /** 
     * 创建新excel. 
     * @param fileDir  excel的路径 
     * @param sheetName 要创建的表格索引 
     * @param titleRow excel的第一行即表格头 
     */  
    public void createExcel(String fileDir,String sheetName,String titleRow[]){  
        //创建workbook  
        workbook = new HSSFWorkbook();  
        //添加Worksheet(不添加sheet时生成的xls文件打开时会报错)  
        Sheet sheet1 = workbook.createSheet(sheetName);    
        //新建文件  
        FileOutputStream out = null;  
        try {  
            //添加表头  
            Row row = workbook.getSheet(sheetName).createRow(0);    //创建第一行    
            for(int i = 0;i < titleRow.length;i++){  
                Cell cell = row.createCell(i);  
                cell.setCellValue(titleRow[i]);  
            }  
            out = new FileOutputStream(fileDir);  
            workbook.write(out);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {    
            try {    
                out.close();    
            } catch (IOException e) {    
                e.printStackTrace();  
            }    
        }    
    }  

    /**
     * 
     * @Description:读取本地文件---/Users/whsgzcy/Desktop/t.txt
     * @author: whsgzcy
     * @date: 2016-12-17 下午5:35:21
     * @param filePath
     *            void
     * @throws
     */
    public static void readTxtFile(String filePath) {
        try {
            String encoding = "UTF-8";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) { // 判断文件是否存在
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file), encoding);// 考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    System.out.println(lineTxt);
                }
                read.close();
            } else {
                System.out.println("找不到指定的文件");
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        GeoGetDataThread dg = new GeoGetDataThread();
        dg.start();
    }

}
package com.iwant.download2geodata;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import net.sf.json.JSONObject;

/**
 * @Description:
 * @author: whsgzcy
 * @date: 2016-12-17 下午1:30:05
 * 
 */
public class HttpRequestUtil {
    
    /**
    * @Description:纯get请求
    * @author: whsgzcy
    * @date: 2016-12-17 下午1:51:14  
    * @param url
    * @return
    * JSONObject
    * @throws
     */
    public static JSONObject getJsonObject(String url) {
        JSONObject jsonObject = null;
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpParams httpParams = httpClient.getParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
            HttpResponse response = httpClient.execute(httpGet);
            StringBuilder builder = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent(),
                            "utf-8"));
            for (String s = bufferedReader.readLine(); s != null; s = bufferedReader
                    .readLine()) {
                builder.append(s);
            }
            jsonObject = JSONObject.fromObject(builder.toString());
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject = null;
        }
        return jsonObject;
    }
}
package com.iwant.download2geodata.data;

import java.io.Serializable;
import java.util.List;

/**
 * @Description: 
 * @author: whsgzcy
 * @date: 2016-12-17 下午2:07:25  
 *    
 */
public class ShopInfo implements Serializable{
    
    private String name;
    private String tel;
    private String address;
    private String longitude;//经度
    private String latitude;//纬度
    private List<TemplateData> templateData;// 图片
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getLongitude() {
        return longitude;
    }
    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }
    public String getLatitude() {
        return latitude;
    }
    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }
    public List<TemplateData> getTemplateData() {
        return templateData;
    }
    public void setTemplateData(List<TemplateData> templateData) {
        this.templateData = templateData;
    }
}
package com.iwant.download2geodata.data;

import java.io.Serializable;
import java.util.List;

/**
 * @Description: 
 * @author: whsgzcy
 * @date: 2016-12-17 下午2:40:12  
 *    
 */
public class ShopList implements Serializable{
    
    private List<ShopInfo> mShopInfoList;

    public List<ShopInfo> getmShopInfoList() {
        return mShopInfoList;
    }

    public void setmShopInfoList(List<ShopInfo> mShopInfoList) {
        this.mShopInfoList = mShopInfoList;
    }

}
package com.iwant.download2geodata.data;

import java.io.Serializable;

/**
 * @Description: 
 * @author: whsgzcy
 * @date: 2016-12-17 下午2:20:13  
 *    
 */
public class TemplateData implements Serializable{
    
    private String pic_info;

    public String getPic_info() {
        return pic_info;
    }

    public void setPic_info(String pic_info) {
        this.pic_info = pic_info;
    }
}

很简单,懂java的应该都能看懂,在此提出一个设计思路,我代码中屏蔽了一个睡眠线程,是防止我的IP被屏蔽,如果加入sleep,那么,线程就会在这段时间执行主线程上的逻辑,我是一次性通过,就懒得加了,有兴趣的同学可以将这块加上,thanks a lot。

时间: 2024-10-10 09:17:53

从高德地图大批量扒取数据,并写入excel的相关文章

如何把高德地图搜索商家电话资料导出成excel里?

有很多人问我,怎么样能够快速的把高德地图左边的搜索列表里的商家地图,电话,导出到EXCEL里. 如何快速地将高德地图里的商家电话资料导出EXCEL? 操作步骤: 1. 选择你要采集的省份, 城市列表里就会有相应的省份的城市列表. 2. 选择要采集的城市,比如: 济南 3. "同时保存为Excel"  选项, 采集完毕后,程序首先会保存一份access数据库文件, 如果这里的对勾打上,则会在相应的文件夹下再产生一个EXCEL文件. 4. "打开文件位置", 采集完毕后

MySQL---数据库从入门走向大神系列(十一)-Java获取数据库/结果集的元信息、将数据表写入excel表格

数据库的元信息: 首先介绍一下数据库的元信息(元数据): 元数据(Metadata)是关于数据的数据. 元数据是描述数据仓库内数据的结构和建立方法的数据. 存储的数据是什么类型,什么驱动等等,这些描述数据的数据,就是元数据! 准备: package cn.hncu.pool3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; i

python读取数据库表数据并写入excel

一个简单的使用python读取mysql数据并写入excel中实例 1.python连接mysql数据库 conn = pymysql.connect(user='root',host='127.0.0.1',port=3306,passwd='root',db='python',charset='utf8') #连接数据库 cur = conn.cursor() 2.读取mysql数据库中表数据 1 sql = 'select * from %s;' %table_name #需要写入exce

ListView中的数据表格写入Excel中

SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "xls"; sfd.Filter = "Excel文?件t(*.xls)|*.xls"; if (sfd.ShowDialog() == DialogResult.OK) {  DoExport(this.listView1, sfd.FileName); } private void DoExport(ListView listView, st

百度地图、高德地图的数据从哪里得到的?[声明我只是此文章的搬运工,从百度知道复制来的]

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念: 如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(或者X,Y,Z

百度地图、高德地图的数据从哪里得到的?

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念:        如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(

Nodejs获取网络数据并生成Excel表格

Nodejs的模版中有很多关于Excel表格的,这里我简单介绍一下我使用过的一个模块的使用. 首先,先安装Excel的模块: npm install node-xlsx 然后,在代码中引入模块: var xlsx = require('node-xlsx'); 最后,获取数据并写入Excel: var fs = require('fs'); var xlsx = require('node-xlsx'); var ajax = require('./ajax.js'); start(); fun

JS爬取高德地图地址信息(周边设施经纬度)

需求:给定进百万小区名称及对应城市信息,通过高德获取其周边设施信息(交通.医疗.教育.生活设施) 高德JS API 爬取灵感来自高德开发支持的JS API,当然你也可以直接调用高德提供的api服务获取地址信息,但是api服务是有次数限制.而JS API的调用并没有次数限制,经我的验证一个爬取节点控制在500毫秒的抓取频率是没有限制的. https://lbs.amap.com/api/javascript-api/example/poi-search/keywords-search 高德地址信息

使用NodeJS+AngularJS+MongoDB实现一个Web数据扒取-分析-展示的系统

说到Web爬虫,Python占了半壁江山.但是Web页面不是Python的强项了,如果需要扒取Web数据,再Mashup出来一个自己的系统,全端JS是个不错的解决方案(其实不用Python扒数据是因为我只能熟练掌握Python的HelloWorld编写). 那么开始做了. 00.要做一只麻雀 想做一个五脏俱全的系统先设计一下结构吧.思路是要扒数据先要配置怎么扒,然后去把扒来的数据处理成想要的东西,再然后存起来慢慢蹂躏.来张UML活动图压压惊.数据CRUD和如何展现不在设计图中,这部分打算做一个类