大众点评数据抓取总结

获取大众点评数据的几种方式的总结

官方API

它在2015.9.30之后就不维护了,升级后的新平台只对商务合作使用,但是只要不关掉服务,还是可以获取的,从他的官方API要获取店铺信息也有两种方式

  1. 先通过接口获取团购信息,就可以得到团购中的店铺id,然后再获取店铺详情。这种方式问题就在于那些没有团购的店铺的信息就没法获取了,但是从我的获取结果看,大概可以获得50%左右,而且团购信息是在不断更新的,所以可以获得的店铺数量也是变化的,累积然后去掉重复的,这样可以提过获取数量。通过这个方式在上海获得了5w多个点,并且是自带经纬度信息的,不用geocoder,从大众点评网上看,他在上海仅美食类就有14w+个点
  2. 通过搜索接口,直接按地域、分类搜素,得到整个城市的店铺信息。这种方式的问题就是,平台对商户类的接口是有次数限制和频次限制,一天是1w次,频次不能太快。实验的每100次请求,停25s,这个频率没问题,最终获得了9w+数据。
  3. 把上面两种方法获得的数据合在一起,去掉重复的,剩下13w+。
    以上两种方式是用java写的,代码在github上

爬虫

直接暴力遍历页面

因为我发现店铺详情页是有规律的,都是www.dianping.com/shop/547234 这样的页面,所以我就想直接暴力遍历页面,实验下来果然不行,会很快被拒绝访问。而且这样的话还有一个很大的问题就是,因为没办法提前知道这个店铺类型,所以页面种类有很多,所以光是获取数据的代码就得根据页面特征,写很多个,分别对应不同的页面。而且这样没法聚焦获得某个城市的数据。只能后期去提取。总之这种方式基本不可行。

从主页进去,正常爬取。

这样就可以入口url就限定城市和分类,而且页面的规律很好找的,比如上海美食的链接就是:www.dianping.com/search/category/1/10。但是大众点评这种站对反爬措施肯定做的很好,我没有找到免费的代理ip,只能模拟下User-Agent,最终从店铺详情信息进去获取的,然后很快就会返回10056。要是直接在搜索的列表页就去获取数据,会更快就返回10056 拒绝访问。我猜他们反爬中对搜索页的访问频次限制的更加严格,而且正常浏览是不会只访问列表而不进去店铺详情页的。这个毕竟反反爬我也不在行,没办法。这个方法基本也是不可取。

技术都是用的很粗糙的技术,直接用python的requests+BeautifulSoup4,没有用开源爬虫。代码在github上

知乎xlzd杂谈-爬虫