有问题可以联系我443144476
博客首页http://blog.csdn.net/dongmeng110
我们都知道目前在国内商户信息最全的莫过google了,具体多少数据量就不得而知了,前几天接到一个项目,好象是给移动弄商户数据,而且全部要带电话,收益很丰厚哦!可惜只要一个省的 要是要全国的 就发了
废话不多说 先介绍一下google的商户接口
声明一下,本文章涉及的所有接口都是从google web服务中截取出来的接口,非google开放的api接口
StringBuilder builder = new StringBuilder(
"http://ditu.google.cn/maps?output=js&q=");
builder.append(q);
builder.append("&sll=");
builder.append(lat_point);
builder.append(",");
builder.append(lng_point);
builder.append("&radius=");
builder.append(radius);
builder.append("&start=");
builder.append(start);
String url = builder.toString();
先介绍一个接口的url,前面不用说了地址 主要是参数 output指出我们需要js代码
q是要查询的字符,(推荐按照google的分类搜索里面的参数进行爬取,这样有利于以后整理分类,当然每个详细分类 还可以单独爬取 只需要每个商户的cid就好了)
sll指的是你要爬取的中心位置经纬度,google是根据一个中心位置加搜索半径来进行检索的
radius是半径 单位公里
start说的是页码,如果返回结果超过10个google会分页 也就是取完前10个之后需要继续取,但是有个事情要说明一下google只支持取前190条数据,一次搜索结果190条以后的是取不到的
那有人会问了,我们需要海量数据,如何办呢
其实也还算简单,只需要深入爬取就好了,举个简单算法(我就是这么用的),大家应该清楚google地图是分块的256×256的块,那我就按照块来爬取,如果一个块的返回结果超过190,我就把这个块放大了下一级的4个块,重新请求以此类推,就可以拿到所有的数据了
请求出来的结果就不贴了 一大段 js 里面有一个json串是包含的数据,不过比较复杂,处理起来比较麻烦,我也是弄了很久才弄好,都是把json转成了xml才容易 查看的,一会我直接 把代码贴上了 一般的网速大概一天 十万条数据没有问题 都带有经纬度,带电话的大概5分之一吧
特别说明的是 需要 频繁更换 ip,我的代码里面有 自动更换IP的接口,不过是 操作我本地路由的,如果有人真需要爬取的话,可以自己实现一个更换路由的方法,注意同步处理哦,如果google开始封锁IP多线程会几乎同时报错,所以要处理一下,只重启一次路由
下面是代码:
package com.mimo.proxy.gansu;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.methods.GetMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mimo.proxy.bdb.KeyDB;
import com.mimo.proxy.bdb.MapEnv;
import com.mimo.proxy.bean.BusinessBean;
import com.mimo.proxy.bean.HttpClientManager;
import com.mimo.proxy.dao.BusinessJdbc;
import com.mimo.proxy.google.GoogleMap;
public class Crawler implements Runnable {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final KeyDB keyDB = MapEnv.getMapEnv().getKeyDB();
@Override
public void run() {
try {
Thread.sleep(2000);
handler(8, 194, 96);
handler(8, 194, 97);
handler(8, 195, 95);
handler(8, 195, 96);
handler(8, 195, 97