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

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

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

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

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

  • 环境和工具包:

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

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

第一步,页面解析

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

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

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

  1. {'名称': 'Maison Lameloise 莱美露滋(上海中心店)', '评分': '4.90', '评价数': '11\ueeb5\ue753', '人均花费': '¥\uf802\uf0b6\ue753\ue867', '推荐': ['鸭肝棒棒糖', '前菜', '餐后甜品']}
  1. <b>11<svgmtsi class="shopNum"></svgmtsi><svgmtsi class="shopNum"></svgmtsi></b>
  2. <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,还为什么要费尽做这个呢。

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

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

  • 方式二:

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

    构造映射字典

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

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

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

    内容如下:

    1. def get_count(self, uncode_list):
    2. try:
    3. count = ""
    4. for uncode in uncode_list:
    5. uncodes_ = uncode.replace('<svgmtsi class="shopNum"', "").replace("</svgmtsi", "").replace("</b>",
    6. "").replace(
    7. "</b>", "").replace("<b>", "").split('>')
    8. # pprint.pprint(uncodes_)
    9. for uncs in uncodes_:
    10. if uncs in self.woff.keys():
    11. cc = self.woff[uncs]
    12. else:
    13. cc = uncs
    14. count += cc
    15. return count
    16. except Exception as e:
    17. logger.info("数字解析出现错误")
    18. return uncode_list[0]
    19. def run(self):
    20. url = 'http://www.dianping.com/shanghai/ch10/r801'
    21. html = self.get_html(url)
    22. shop_el_list = html.css("#shop-all-list li")
    23. for shop_info in shop_el_list:
    24. item = {}
    25. shop_name = shop_info.css("div.txt div.tit a::attr(title) ").extract_first()
    26. item["名称"] = shop_name
    27. score = shop_info.css("div.txt div.comment div.nebula_star div.star_score::text").extract_first()
    28. item["评分"] = score
    29. review_num = shop_info.css("div.txt div.comment>a.review-num > b ").extract()
    30. item["评价数"] = self.get_count(review_num)
    31. mean_price = shop_info.css("div.txt div.comment>a.mean-price > b ").extract()
    32. item["人均花费"]=self.get_count(mean_price)
    33. # item["类型"]
    34. # item["地址"]
    35. recommend = shop_info.css("div.txt div.recommend>a::text").extract()
    36. item["推荐"] = recommend
    37. 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. 你知道如何自动保存 Spring Boot 应用进程号吗

    1. 前言 欢迎阅读 Spring Boot 2 实战 系列文章. PID 对于系统运维来说并不陌生,但是对于一些开发者特别是新手还是要简单介绍一下的.它是 Process ID 的简称,是系统分配给 ...

  2. Extjs——简单的Grid panel小实例

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  3. PHP出现SSL certificate:unable to get local issuer certificate的解决办法

    当本地curl需要访问https时,如果没有配置证书,会出现SSL certificate: unable to get local issuer certificate错误信息. 解决办法: 1.下 ...

  4. windows搭建Selenium

    安装 pip install -U selenium 安装浏览器驱动 用不同的浏览器需要安装不同的驱动,驱动放置的路径添加到path中. Firefox geodriver Chrome 下载驱动Ch ...

  5. AppBoxFuture: Web在线报表设计与PDF生成

      企业应用需要打印各类单证及报表,为了方便开发此类应用作者在框架内集成了报表引擎,并且实现了基于Canvas的Web在线报表设计及基于PDFJS的报表查看与打印. 一.原理浅析 报表模型:由Xml描 ...

  6. fasttext 和pysparnn的安装

  7. deepin15.11小毛病解决

    目录 边缘花屏问题 QQ`Tim头像问题 ssh卡死问题 看直播卡 边缘花屏问题 sudo apt install systemsettings 打开kde系统设置 打开显示与设置,修改如图下,基本上 ...

  8. session开启慢的原因及解决办法

    做微信开发的时候发现微信回复特别慢,发个消息要好几秒才回复,发现不正常后就赶紧找答案,到最后发现是session_start()开启很慢,这是因为session缓存文件过多,默认缓存文件在:win:w ...

  9. [Linux] 检查是否已有进程在运行

    出处:sblim-sfcb-1.4.9 / sfcBroker.c int process_is_running() { #define STRBUF_LEN 512 #define BUF_LEN ...

  10. [Qt] QProcess::startDetached() 避免弹窗,或者窗口一闪而过

    主动宣告setProcessState(QProcess::NotRunning)   或者在堆上new一个QProcess.     出处:  https://stackoverflow.com/q ...