大众点评数据获取 --- 基础版本

大众点评是一款非常受普罗大众喜爱的一个第三方的美食相关的点评网站。

因此,该网站的数据也就非常有价值。优惠,评价数量,好评度等数据也就非常受数据公司的欢迎。

今天就写了一个简单的大众点评列表页数据抓取demo。

希望对看到这篇文章的朋友有所帮助。

  • 环境和工具包:

    • python 3.6
    • 自建的IP代理池(使用的是ipidea的国内代理)
    • parsel(页面解析)
    • loguru(报错提示)

下面就让我看开启探索之旅

第一步,页面解析

从图中可以看到,对应的数字都是方框。那具体是什么呢?

下图是我简单处理后,控制台输出的内容。以及直接在html中右键查看网页源码

由此可以看到下面连个内容

{'名称': 'Maison Lameloise 莱美露滋(上海中心店)', '评分': '4.90', '评价数': '11\ueeb5\ue753', '人均花费': '¥\uf802\uf0b6\ue753\ue867', '推荐': ['鸭肝棒棒糖', '前菜', '餐后甜品']}
<b>11<svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>

<b>¥<svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>

也就是说,评价数据和人均消费价格数据,都应经被隐藏了。

这种方式焦作svg映射。

那么该怎么搞定这些数据呢。

首先我们需要找到网页打开后,他们所引用的woff字体文件。

在F12中,选中Network,然后再次选中第三行菜单栏中的Font。现在,在杂论的网络访问内容中,就只有几个woff文件了。

下一步就是打开这个文件了。

打开的方式有两种

  • 方式一:

    • 首先下载好目标woff,直接右键这个访问内容,选中"Open in new tab"就会下载这个woff文件

    • 打开https://www.fontke.com/tool/convfont/这个地址,在线转换成ttf文件

    • 打开http://fontstore.baidu.com/static/editor/index.html这个地址,在线解析刚打开的ttf文件

    • 会看到这种:

    • 通过查找字形:

      通过观察,我们看到在百度字体解析的文字代码中,都是以“unie”开头的,那么我们将之前看到的编码内容组合后进入字体文件中搜索,就可以验证该编码是否正确对应网页显示的数字了。

      比如

      我们通过一一对应,很容易就知道“\ueeb5”是3,“\ue753”是7,还为什么要费尽做这个呢。

      目的有两个,一个是验证这种设想,还有一种是为了下一篇复杂篇的内容埋个伏笔。

      果真,在其中一个文件中找到了对应的字符编码,说明想法没有错误

  • 方式二:

        需要安装fontTools包,没安装的请(pip install fontTools)
        from fontTools.ttLib import TTFont
        def get_xml(self):
            font = TTFont('dzdp.woff')
            font.saveXML('dzdp.xml')
    
    • 执行上述方法(和脚本放在同一目录下,改好名字),就会得到一个xml文件,然后用工具打开这个xml文件,直接全局搜索eeb5,很快就会定位到这么一行。从而就会很清楚的了解到。页面中的0xeeb5和ttf文件中的unieeb5是意义对应关系。也就再次证明了0xxeb5就是数字3

    构造映射字典

    从刚才的页面解析中,我们已经明白了“\ueeb5”是3,“\ue753”是7,那么咱们再次在页面中找到其他的相关数字,【0-9】十个数字很容易就组合出来了。记住,1不需要重构,。

    self.woff = {
                "\uf0b6": "0",
                # "": "1",
                "\uf802": "2",
                "\ueeb5": "3",
                "\ueb5e": "4",
                "\uf508": "5",
                "\ue867": "6",
                "\ue753": "7",
                "\uf0a6": "8",
                "\uf506": "9",
            }
      不要正对着数据抄写,点评的字体svg经常改变。需要自己对应当时的情况写一下
    

    省下的就是直接处理数据和解析数据了。

    内容如下:

        def get_count(self, uncode_list):
            try:
                count = ""
                for uncode in uncode_list:
                    uncodes_ = uncode.replace('<svgmtsi class="shopNum"', "").replace("</svgmtsi", "").replace("</b>",
                                                                                                               "").replace(
                        "</b>", "").replace("<b>", "").split('>')
                    # pprint.pprint(uncodes_)
                    for uncs in uncodes_:
                        if uncs in self.woff.keys():
                            cc = self.woff[uncs]
                        else:
                            cc = uncs
                        count += cc
                return count
            except Exception as e:
                logger.info("数字解析出现错误")
                return uncode_list[0]
    
            def run(self):
            url = 'http://www.dianping.com/shanghai/ch10/r801'
            html = self.get_html(url)
            shop_el_list = html.css("#shop-all-list li")
            for shop_info in shop_el_list:
                item = {}
                shop_name = shop_info.css("div.txt div.tit a::attr(title) ").extract_first()
                item["名称"] = shop_name
                score = shop_info.css("div.txt div.comment div.nebula_star div.star_score::text").extract_first()
                item["评分"] = score
                review_num = shop_info.css("div.txt div.comment>a.review-num > b ").extract()
                item["评价数"] = self.get_count(review_num)
                mean_price  = shop_info.css("div.txt div.comment>a.mean-price > b ").extract()
                item["人均花费"]=self.get_count(mean_price)
                # item["类型"]
                # item["地址"]
                recommend = shop_info.css("div.txt div.recommend>a::text").extract()
                item["推荐"] = recommend
                print(item)
    

    上述代码就是这个demo中最关键的两个内容,一个是逻辑,一个是数字解析。这里我就不费口舌进行一一解释了。同学们自己看下吧。

成果展示

存在的缺点

  • 如果点评换了一版映射,咱们就要重新做一次字典集合

  • 只是简单的对【0-9】十个数字的映射做了解析。我想拿文字怎么办?

    我的demo中就有类型和地址两个字段没有进行数据填充,因为这两个字段就是有文字映射的,这个问题会在下一篇中进行解答。

    同时也会解决点评网站换动态字体该怎么解决的。

咱们Python爬虫丨大众点评数据爬虫教程(2)见~~~

​ 本文章旨在用于交流分享,【未经允许,谢绝转载】

Python爬虫丨大众点评数据爬虫教程(1)的更多相关文章

  1. Python爬虫丨大众点评数据爬虫教程(2)

    大众点评数据爬虫获取教程 --- [SVG映射版本] 前言: 大众点评是一款非常受大众喜爱的一个第三方的美食相关的点评网站.从网站内可以推荐吃喝玩乐优惠信息,提供美食餐厅.酒店旅游.电影票.家居装修. ...

  2. 用Python爬取大众点评数据,推荐火锅店里最受欢迎的食品

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:有趣的Python PS:如有需要Python学习资料的小伙伴可以加点 ...

  3. Python数据分析:大众点评数据进行选址

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:砂糖侠 如果你处于想学Python或者正在学习Python,Pyth ...

  4. Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 胡萝卜酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  5. 【Python3爬虫】大众点评爬虫(破解CSS反爬)

    本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...

  6. python爬取大众点评

    拖了好久的代码 1.首先进入页面确定自己要抓取的数据(我们要抓取的是左侧分类栏-----包括美食.火锅)先爬取第一级分类(美食.婚纱摄影.电影),之后根据第一级链接爬取第二层(火锅).要注意第二级的p ...

  7. python爬取大众点评并写入mongodb数据库和redis数据库

    抓取大众点评首页左侧信息,如图: 我们要实现把中文名字都存到mongodb,而每个链接存入redis数据库. 因为将数据存到mongodb时每一个信息都会有一个对应的id,那样就方便我们存入redis ...

  8. python python 入门学习之网页数据爬虫cnbeta文章保存

    需求驱动学习的动力. 因为我们单位上不了外网所以读新闻是那么的痛苦,试着自己抓取网页保存下来,然后离线阅读.今天抓取的是cnbeta科技新闻,抓取地址是http://m.cnbeta.com/wap/ ...

  9. python python 入门学习之网页数据爬虫搜狐汽车数据库

    自己从事的是汽车行业,所以首先要做的第一个程序是抓取搜狐汽车的销量数据库(http://db.auto.sohu.com/cxdata/): 数据库提供了07年至今的汽车月销量,每个车型对应一个xml ...

随机推荐

  1. codeforces 122C perfect team

    You may have already known that a standard ICPC team consists of exactly three members. The perfect ...

  2. 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!

    相信大家在使用各种各样强大的 IDE 写代码时都会注意到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套语法高亮规则.这样不仅美观,而且方便代码的阅读. 而在上古神器 Vim 中,我们通常 ...

  3. 前端学习笔记-H5

    H5常用标签及其属性: <a>标签做超链接: <p>段落标签,自带段间距和换行样式: <div>块标签,表示一块内容,没有具体语意,区别与p标签,块与块间没有间距: ...

  4. 关于MIME类型问题,浏览器请求到的资源是乱码

    简介 我想很多同学都可能会遇到这样的问题,调用后台提共的静态资源服务api时,用浏览器打开发现却是一堆乱码.需要的是 JSON, 拿到的却是 xml,访问一个mp4的文件,浏览器直接下载.这一切的来源 ...

  5. [PHP][thinkphp5] 学习二:路由、配置调用、常量定义调用

    路由: 其实TP5就是一个集多家框架所长而成的,感觉失去了自己的特色!路由这块呢类似于laravel框架!废话不说直接上码! 路由配置,类似laravel,就在route.php文件里配置路由(文件所 ...

  6. 让所有网站都提供API的Python库:Toapi

    这是一个让所有网站都提供API的Python库.以前,我们爬取数据,然后把数据存起来,再创造一个api服务以便其他人可以访问.为此,我们还要定期更新我们的数据.这个库让这一切变得容易起来.你要做的就是 ...

  7. 文本序列化【通用】word2sequence,文本序列字典保存

    ''' 文本序列化 ''' class WordSequence(): UNK_TAG = "<UNK>" PAD_TAG = "<PAD>&qu ...

  8. 今天,VS Code 五岁了。

    时光飞逝,岁月如梭.今天,VS Code 迎来了 5 岁的生日. 回想起 VS Code 发布的那一天,仿佛还在昨天. 回顾 VS Code 这五年的发展,总是能给我们开发者带了无限的惊喜. 2015 ...

  9. 学会HTML就可以找工作了

    对编程小白来讲,想要学习门槛低,学习周期短,难度指数可忽略.短时间内可能找一份薪资不错编程相关工作,那就把HTML作为入门级语言吧. 网页设计师 (//upload-images.jianshu.io ...

  10. dhcpd.conf(5) - Linux man page

    http://linux.die.net/man/5/dhcpd.conf Name dhcpd.conf - dhcpd configuration file Description   The d ...