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

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

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

今天就写了一个简单的大众点评列表页数据抓取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. Sprint 2 : ios图形界面设计与代码整合

    这周我们主要focus在personal photo experience 项目的ios图形界面设计与代码整合工作上. 工作进度: 1. 图形界面设计方面:兆阳和敏龙基本已经将ios手机客户端的雏形界 ...

  2. C - N皇后问题 DFS

    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合法的放置方法. Inpu ...

  3. OkHttp 优雅封装 HttpUtils 之 气海雪山初探

    曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 介绍 HttpUtils 是近期开源的对 OkHttp 轻量封装的框架,它独创的异步预 ...

  4. 使用HTMLTestRunner生成报告

    使用HTMLTestRunner生成报告 unittest本身并不具备这个功能,需要使用HTMLTestRunner库 使用步骤: 首先需要下载.py文件:http://tungwaiyip.info ...

  5. iOS中点击事件失效的解决办法

    解决办法有 2种可供选择: 将目标​元素换成 <a> 或者 button 等可点击的​元素 ​给​目标元素加一条样式规则 cursor : pointer;

  6. MySQL使用mysqldump+binlog完整恢复被删除的数据库

    (一)概述 在日常的MySQL数据库运维过程中,可能会遇到用户误删除数据,常见的误删除数据操作有: 用户执行delete,因为条件不对,删除了不应该删除的数据(DML操作): 用户执行update,因 ...

  7. leetcode-0617 合并二叉树

    题目地址https://leetcode-cn.com/problems/merge-two-binary-trees/ 1.递归解法 递归的话我们首先需要递归的终止条件,对于本题而言,递归的终止条件 ...

  8. 形象地展示信号与系统中的一些细节和原理——卷积、复数、傅里叶变换、拉普拉斯变换、零极图唯一确定因果LTI系统

    看懂本文需要读者具备一定的微积分基础.至少开始学信号与系统了本文主要讲解欧拉公式.傅里叶变换的频率轴的负半轴的意义.傅里叶变换的缺陷.为什么因果LTI系统可以被零极图几乎唯一确定等等容易被初学者忽略但 ...

  9. 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素

    原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ...

  10. Python常用库-Psutil

    背景 介绍一个处理进程的实用工具,这个是一个第三方库.应用主要有类似ps.cd.top,还有查看硬盘.内存使用情况等. 推荐的理由主要有 2 个,第一个是跨平台的,不管是OSX.Centos.Wind ...