爬取美团网的美食点评信息(含页面分析过程)

写在前面:

       凭借兴趣写了很多爬虫的小程序,但是都没有以博文的形式分享出来。爬取美团网的数据是因为课题研究需要,已经将深圳所有的美团店铺评论数据爬取完毕(大众点评和百檽米的相应区域也已爬取完毕,对爬虫有兴趣可以看我的GitHub主页:https://github.com/slpslpslp ,觉得不错的帮忙加个星,谢谢)。这是写的第一篇爬虫博客,这里只简单分析思路,代码我的主页上有。

分析过程:

        我爬取的区域是深圳市,因此以深圳的美食为例,分析其网页架构: 

        我的最终目的是要获取深圳市美团上美食里面的每一个店铺里面的每条评论信息。因此我应该从整个深圳市美食里入手。

      (1)将整个深圳市切化到行政区子块

爬取美团网的美食点评信息(含页面分析过程)_第1张图片

     这是通过选择美食深圳两个标签之后的页面。这样我们有三种策略进行分块爬取操作:1:按照菜品分类;2:按照区域;3:按照用餐人数。在这里你会发现:当你选择菜品分类时,如果你点击“代金券”,那么其网页路由相应由http://sz.meituan.com/meishi/变为"http://sz.meituan.com/meishi/c393/",那么变化就在于后者多了‘c393’,因此c393就是”代金券“的类别号。同理,以区域选择时,我们也可以获得其区域类别号。由于区域方便理解与管理,因此我采取的是分行政区爬取店铺信息。

  (2)将整个深圳市切化到行政区子块

爬取美团网的美食点评信息(含页面分析过程)_第2张图片

     同时,在一个区内又有很多子区域,因此我们需要知道子区域的分类号,当点击”香蜜湖“的时候,发现网页是http://sz.meituan.com/meishi/b1056/,因此b1056代表的就是香蜜湖美食分类号。进入到香蜜湖美食页面中,我们发现区域已经不能再细分了,那么ok,可以开始思考如何获取其店铺信息了。

  (3)通过浏览器开发者功能解析网页中数据来源

        在这里推荐使用FireFox的Web开发者和Chrome的开发者工具,这里以Chrome浏览器为例。按下F12,点到NetWork选项下。这里有个小技巧:我们先刷新一下页面试试,看看页面中哪些区域是XHR的返回结果(就是点击刷新有变化的区域,也就是所谓的异步加载)。一:如果页面整体刷新,那么我们可以直接解析返回的html,也就是浏览器中ALL下Type里面document内容,通过BeautifulSoup、re正则解析和xpath解析即可。二:如果页面部分刷新,在本例中,店铺展示区域异步刷新了,那么我们就直接通过点击Network下的XHR过滤掉其他不必要的信息。

爬取美团网的美食点评信息(含页面分析过程)_第3张图片

点击xhr里面的信息,我们发现,这个里面就是保存了我们想要的信息,包括店铺id(进入店铺详细页的入口)、店铺的各项其他概述信息以及十分重要的子区域店铺总数量‘totalCounts’信息(通过它我们可以知道有多少页店铺信息)。

爬取美团网的美食点评信息(含页面分析过程)_第4张图片

在我们获取了店铺id后,就已经获得了店铺详细信息的入口。例如上上个页面中的“顺德大盘鱼”店铺,它的店铺详细url是:http://www.meituan.com/meishi/6214364/ 。

爬取美团网的美食点评信息(含页面分析过程)_第5张图片

爬取美团网的美食点评信息(含页面分析过程)_第6张图片

在店铺详细页面里面,我截的第一张图里需要在html里面解析出其人均、评分、地址、经纬度信息(这个也在html里面,)、电话等信息。具体解析在在getEachPoiShopsInfos.py里面有:

def parseShopHtml(html):
    html = str(html)
    pattern = re.compile('"detailInfo":(.*?),"photos"', re.S)
    # 注意,有些店铺已经消失了,所以需要判断是否是回到了美团主界面
    if re.search(pattern, html):
        detailInfos = re.search(pattern, html).group(1)
    else:
        return False
    # 将解析到的字符串转为字典
    detailInfo_dict = json.loads(detailInfos)
    shopId = detailInfo_dict.get('poiId')
    shopName = detailInfo_dict.get('name')
    longitude = detailInfo_dict.get('longitude')
    avgScore = detailInfo_dict.get('avgScore')
    latitude = detailInfo_dict.get('latitude')
    openTime = detailInfo_dict.get('openTime')
    address = detailInfo_dict.get('address')
    phone = detailInfo_dict.get('phone')
    avgPrice = detailInfo_dict.get('avgPrice')
    shopInfos = pd.DataFrame(
        {'shopId': [shopId], 'shopName': [shopName], 'longitude': [longitude], 'avgScore': [avgScore],
         'latitude': [latitude], 'openTime': [openTime], 'address': [address], 'phone': [phone],
         'avgPrice': [avgPrice]})
    shopInfos.to_csv('./{0}S.csv'.format(shopId), index=False)
    return True

店铺详细页的评论信息,和前面店铺的id获取一样,也是XHR异步加载得来的(知道数据来源就很简单了,就只是解析json字符串而已)

爬取美团网的美食点评信息(含页面分析过程)_第7张图片

(4)最终获取的数据展示

爬取美团网的美食点评信息(含页面分析过程)_第8张图片

爬取美团网的美食点评信息(含页面分析过程)_第9张图片

爬取美团网的美食点评信息(含页面分析过程)_第10张图片

爬取美团网的美食点评信息(含页面分析过程)_第11张图片

写到最后

        这份代码我是几个月前写的了,当时并没有考虑使用Scrapy(高效率爬取框架),也没有使用多线程多进程,是一个行政区的一个小区域这样子慢慢获取的,所以效率不太高。另外,当时有段时间我的ip被禁了,我就用了代理ip池去获取的,但是通过西刺代理这类的代理ip其实很劣质,要有效的还是得掏钱。不过后来我发现怎么爬都不禁我的ip了,甚是奇怪。最后,毕竟过了这么久,可能一些细节的页面规则有所改动,但是改动应该不大,所以如果想直接用我的代码获取数据,可能需要自己稍微改改。

你可能感兴趣的:(爬取美团网的美食点评信息(含页面分析过程))