前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

首先笔者定位为成都,美食类型选的“火锅”,火锅具体类型选的不限,区域选的不限,排序选的智能,如图:

你也可以选择别的选项,只是注意URL的变化。本文都是按照上述选项爬取的数据。接下来翻页观察一下URL的变化:

第二页:

第三页:

很容易观察出翻页变化的知识p后面的数字,倒推回第一页,发现一样的显示内容,因此,写一个循环,便可以爬取全部页面。

但是大众点评只提供了前50页的数据,所以,我们也只能爬取前50页。

这一次,笔者用的pyquery来分析网页的,所以我们需要定位到我们所爬取的数据的位置,如图:

在具体分析的网页的时候,我震惊了,大众点评的反爬做的太过分了,它的数字,一些文字居然都不是明文显示,而是代码,你还不知道怎么分析它。如图:

很烦的,一些文字又可以显示,一些又用代码表示。一些数字也是,不过好一点的是数字只有9个,只要稍微观察一下,就能发现数字的代码是什么了。这里笔者列出来了。 {'hs-OEEp': 0, 'hs-4Enz': 2, 'hs-GOYR': 3, 'hs-61V1': 4, 'hs-SzzZ': 5, 'hs-VYVW': 6, 'hs-tQlR': 7, 'hs-LNui': 8, 'hs-42CK': 9}。值得注意的是,数字1,是用明文表示的。

那么,如何用pyquery来定位呢,很简单,你找到你要获取的数据,然后右键→copy→cut selector,你复制到代码里面就OK了。pyquery的具体用法百度既有。

最后,我们获取了火锅50个页面的数据,每页15个数据,一共750家餐厅的数据。

分析

大众点评已经给出了星级评价,可以看看大致趋势。

准五星商户最多,可能因为大部分食客都习惯给好评,只有实在不满时才会打出低评有关,造成了评级一般不低,但近满分还是蛮少的。

在本文,我们假设评论数目为饭店的热度,也就是它越火,评论数目越多。

评论数目大多在1000以内,但是高于2000,甚至高于4000也还存在一些,这些饭店应该是一些网红店。以5000为约束,筛选出饭店均为小龙坎、蜀大侠都非常知名的火锅店。那么评论数量和星级有关系吗?看下图:

这里取其评论数平均值,发现对于四星以上商户来说,评论数和星级并不关系,但均比低于四星的饭店销量更好。这说明在四星以上之后,人们选择差别不大,但一般不愿意接受评论太差的饭店。

对于笔者这样的学生党来说,影响较大还有人均消费情况。

成都的火锅店人均消费大部分都在50-100的区间内,高于150的也有一些。对于笔者来讲,吃一顿火锅,人均在50-100是可以接受的,高于100,就要低头看看钱包了()。那扩展看,人均消费和星级、评论数量有关系吗?

上图是人均消费和星级的关系,看起来并无任何关系,那说明一些口碑好的火锅店,其实人均也不贵。下面看看人均和评论数目的关系吧。

通过比较,发现评论数目低于500,人均在50-100区间是最多的。当然这肯定和评论数量、人均消费本身集中于这一阶段有关。

吃火锅,一家店的生意好坏,肯定还和它的特色菜有关,笔者通过jieba分词,将爬取到的推荐菜做了一个词云图,如下。

笔者最爱的牛肉是特色菜之最啊,尤其是麻辣牛肉,只要去吃火锅,都要来上一份,其次是毛肚、虾滑、鹅肠等等。

接下来是大家都关心的,口味、环境和服务的情况。

三者得分大多都是集中在8.0-9.2这一阶段,笔者认为,低于7.5分的饭店还是不要去尝试了。同时,星级评价应该也是由这三者得分产生的。

果然如预想的一向,星级评价越好,它在口味、环境和服务的得分越高。那么口味,环境,服务得分与评论数量,平均价格有关系吗?

如图所看,并无什么直接关系,但是我们发现口味、环境和服务三者之间存在着非常好的线性关系,于是单独拿出来画了一个较大的图。

我们并且拟合了线性关系,由于三星商户只有一家,它的情况较为特殊之外,其他星级在口味、环境和服务的关系拟合中保持的相当一致,这也证明我们的猜想,这些变量之间存在线性关系。鉴于笔者本文最大的目的是做推荐,于是,我们进行了K-means聚类,这里取K为3,并且把星级转换为数字,五星对应5分,准五星对应4.5分,以此类推。最终得到了三类,通过作图,看看聚类情况如何吧。

和我们想要的结果一致,在口味、环境、服务和星级上得分越高,我们就越推荐。然而推荐的店铺还是好多,能不能在集中一些呢?于是通过限制评论数量、人均消费和特色菜来进行推荐。由于笔者喜欢人少,便宜还有牛肉的店铺,这里得到了如下的结果:

代码

import time

import requests

from pyquery import PyQuery as pq

import pandas as pd

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}

def restaurant(url):

# 获取网页静态源代码

try:

response = requests.get(url, headers=headers)

if response.status_code == 200:

return response.text

except Exception:

return None

name=[]

url = []

star = []

comment = []

avg_price = []

taste = []

environment = []

services = []

recommend = []

num = {'hs-OEEp': 0, 'hs-4Enz': 2, 'hs-GOYR': 3, 'hs-61V1': 4, 'hs-SzzZ': 5, 'hs-VYVW': 6, 'hs-tQlR': 7, 'hs-LNui': 8, 'hs-42CK': 9}

def detail_number(htm):

try:

a = str(htm)

a = a.replace('1<', '<')

a = a.replace('.', '')

b = pq(a)

cn = b('span').items()

number = ''

for i in cn:

attr = i.attr('class')

if attr in num:

attr = num[attr]

number = number + str(attr)

number = number.replace('None', '')

except:

number = ''

return number

def info_restaurant(html):

# 获取饭店的名称和链接

doc = pq(html)

for i in range(1,16):

#获取饭店名称

shop_name = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.tit > a:nth-child(1) > h4').text()

if shop_name == '':

break

name.append(shop_name)

#获取饭店链接

url.append(doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.pic > a').attr('href'))

try:

star.append(doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.comment > span').attr('title'))

except:

star.append("")

#获取评论数量

comment_html = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.comment > a.review-num > b')

comment.append(detail_number(comment_html))

#获取人均消费

avg_price_html = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.comment > a.mean-price > b')

avg_price.append(detail_number(avg_price_html))

#获取口味评分

taste_html = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > span > span:nth-child(1) > b')

taste.append(detail_number(taste_html))

#获取环境评分

environment_html = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > span > span:nth-child(2) > b')

environment.append(detail_number(environment_html))

#获取服务评分

services_html = doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > span > span:nth-child(3) > b')

services.append(detail_number(services_html))

#推荐菜,都是显示三道菜

try:

recommend.append(doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.recommend > a:nth-child(2)').text()+str(',')+\

doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.recommend > a:nth-child(3)').text()+str(',')+\

doc('#shop-all-list > ul > li:nth-child('+str(i)+') > div.txt > div.recommend > a:nth-child(4)').text())

except:

recommend.append("")

for i in range(1,51):

print('正在获取第{}页饭店信息'.format(i))

hotpot_url = 'http://www.dianping.com/chengdu/ch10/g110p'+str(i)+'?aid=93195650%2C68215270%2C22353218%2C98432390%2C107724883&cpt=93195650%2C68215270%2C22353218%2C98432390%2C107724883&tc=3'

html = restaurant(hotpot_url)

info_restaurant(html)

print ('第{}页获取成功'.format(i))

time.sleep(12)

shop = {'name': name, 'url': url, 'star': star, 'comment': comment, 'avg_price': avg_price, 'taste': taste, 'environment': environment, 'services': services, 'recommend': recommend}

shop = pd.DataFrame(shop, columns=['name', 'url', 'star', 'comment', 'avg_price','taste', 'environment', 'services', 'recommend'])

shop.to_csv("shop.csv",encoding="utf_8_sig",index = False)

python实现食品推荐_用Python爬取点评数据,推荐火锅店里最受欢迎的食品相关推荐

  1. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

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

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

  3. python 扒数据_不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  4. python视频网站分类_科学网—爬取网站视频简单方法之一:python的you-get模块使用方法 - 周朝宪的博文...

    目的:网站有海量的视频(包括讲座.电影电视剧等),用python语言的you-get模块爬下来 1.安装you-get模块 在pycharm的terminal下安装.pip install you-g ...

  5. python商品评论分析_用python3爬取天猫商品评论并分析(1)

    在上一篇文章我们已经完成数据的采集,并将数据存储在mysql,现在我们来继续后面的数据分析工作,先放出项目流程: 0.主要流程 0.数据采集 0. 目标网址获取 1. 爬虫框架选用 注:了解这一步请登 ...

  6. python爬虫小案例_从豆瓣爬取《哪吒之魔童降世》的剧照

    一.在豆瓣电影网爬取以下剧照保存到本地: 本次案例只爬取前 5 页的剧照,先获取前五页的链接: for i in range(5):url = 'https://movie.douban.com/su ...

  7. 【Python】实现爬虫(完整版),爬取天气数据并进行可视化分析

    ✌️✌️✌️大家好呀,你们的作业侠又轰轰轰的出现了,这次给大家带来的是python爬虫,实现的是爬取某城市的天气信息并使用matplotlib进行图形化分析✌️✌️✌️ 好了,老规矩,我的可爱粉丝们不 ...

  8. Python+Selenium模拟淘宝滑块并爬取商品数据

    注:如果侵犯了Alibaba的权益,请联系我删除. 上一篇博客已经完成了模拟淘宝登陆,本节主要记录如何爬取淘宝商品列表页数据,同时如何模拟人的操作完成滑块的验证. 代码如下: #encoding=ut ...

  9. python 爬虫课程推荐_关于递归抓取的课程推荐

    Python爬虫包 BeautifulSoup 递归抓取实例详解概要:爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另一个 ...

最新文章

  1. 不可不知 DDoS的攻击原理与防御方法(2)
  2. 查看mysql数据库的主机_MySQL查看或显示数据库(SHOW DATABASES语句)
  3. 【Mysql】 局域网远程连接问题
  4. 文献记录(part37)--A two-stage hybrid ant colony optimization for high-dimensional feature selection
  5. 个人作业五:四则运算二
  6. 【算法分析与设计】基数排序
  7. 190910-ajax-请求小结
  8. gstream初次尝试
  9. 详解MES系统在钢铁企业的应用分析
  10. Transformer结构详解
  11. [高考作文] 秋细雨VS叶闲花
  12. iOS 手势的使用方法(一)
  13. 微服务项目:尚融宝(38)(核心业务流程:申请借款额度(1))
  14. vue3中添加elementui插件
  15. Linux串口通信之termios结构体
  16. redis数据类型总结
  17. ll -h和du -sh的区别
  18. 我的职业是前端工程师【五】: 前端工程师必会的六个调试技能
  19. java 多线程 从无到有_多线程断点续传(简单demo)——从无到有
  20. C语言中union与struct的区别及sizeof的计算方式

热门文章

  1. 隐藏百度地图logo图标
  2. 程序员如何做到每天 17:00 准时下班?
  3. jQuery怎么加载一个html页面到我指定的div里面
  4. 微软推送补丁的服务器叫什么,微软推送Windows Server 2019更新KB4489899补丁
  5. 【Win10应用开发】自定义桌面壁纸
  6. 快速解决Error running ‘XX‘:Command line is too long. Shorten command line for XX or also for.......
  7. 情有独钟,迷情电子三五年(三)
  8. 使用Latex输入定积分竖线
  9. linux删除用户名命令,linux删除用户的命令是什么?
  10. [ATL/WTL]_[初级]_[窗口如何实现一个Tooltip]