获取美团商家评论词并生成词云

  • 环境
  • 准备工作
  • 编写代码
  • 完整代码
  • 注意
  • 成品

环境

  1. windows10
  2. python3.7

准备工作

随便打开一个商家按下F12查找评论的数据

拿到需要的链接

分析链接修改特定的参数

https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=F68E2DEAA22D6B61AA2A82D1487741CB95789F9E439DCECA46801E0D98937E49&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F156848271%2F&riskLevel=1&optimusCode=10&id=156848271&userId=&offset=0&pageSize=10&sortType=1

对应着cookie

对应着商家标识

需要获取的评论数目

编写代码

需要用的的python库

需要用到的全局变量

# 浏览器标识
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36']# 存放IP
ip_list = []
# 商家评价星数
star = 0
# 美团cookie
cookie_str = ""

1. 获取代理IP进行访问美团

# 获取代理IP
def get_ip():global ip_listip_shumu = 0ip_chengg = 0# 请求头header = {'User-Agent': user_agents[random.randint(0, len(user_agents)-1)],'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Host': 'www.89ip.cn'}# 获取页数print('获取IP中。。。')for i in range(1, 2):ip_url = 'http://www.89ip.cn/index_{}.html'.format(i)try:ip_html = requests.get(ip_url, headers=header)except ConnectionError:time.sleep(2)ip_html = requests.get(ip_url, headers=header)if ip_html.status_code == 200:print("连接IP代理网站成功。。。")# 替换掉HTML的空格和换行html = ip_html.text.replace(" ", "").replace("\n", "").replace("\t", "")# 匹配IP和端口的正则表达式r = re.compile('<tr><td>(.*?)</td><td>(.*?)</td><td>')# 匹配到的IP与端口ip_data = re.findall(r, html)ip_shumu += len(ip_data)for k in range(len(ip_data)):# 拼接IP与端口ip = "https://" + ip_data[k][0] + ":" + ip_data[k][1]ip_a = {"https://": ip}# 测试可不可用ping = requests.get("https://www.baidu.com", proxies=ip_a)if ping.status_code == 200:ip_list.append(ip_a)ip_chengg += 1print('获取到的IP数:{0}\n有效的IP数:{1}'.format(ip_shumu, ip_chengg))

2. 获取美团的cookie,,后面需要用到

# 获取美团cookie
def get_cookie():global cookie_strheader = {'Host': 'www.meituan.com','User-Agent': user_agents[random.randint(0, len(user_agents)-1)],}a = 0while True:cookie_req = requests.get("https://gz.meituan.com/s/", headers=header, proxies=ip_list[random.randint(0, len(ip_list) - 1)])if cookie_req.status_code != 302:breaka += 1# 重试次数过多重新获取IPif a == 10:ip_list.clear()get_ip()a = 0cookie_dic = requests.utils.dict_from_cookiejar(cookie_req.cookies)for key in cookie_dic:for val in cookie_dic.values():cookie_str += key + '=' + val

3. 搜索商家获取其商家ID标识

# 获取美团商家ID
def get_shangjia(shangjia):header = {'User-Agent': user_agents[random.randint(0, len(user_agents)-1)],'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Cookie': cookie_str,'Host': 'gz.meituan.com','Upgrade-Insecure-Requests': '1',}url = "https://gz.meituan.com/s/{0}/".format(shangjia)for i in range(len(ip_list)):# 请求get_html = requests.get(url, headers=header, proxies=ip_list[i])# 替换掉空格换行html = get_html.text.replace(" ", "").replace("\n", "")try:# 匹配到错误信息进行下一轮循环re.search(r'error-word', html).group()continueexcept AttributeError:break# 匹配IDr = re.compile(r'data-poiid="[1-9]\d*"',)a = re.findall(r, html)try:return re.search(r'[1-9]\d*', a[0]).group()# 获取页面失败except IndexError:ip_list.clear()get_ip()get_shangjia(shangjia)

4. 获取评价

# 获取美团商家评价
def get_data(url):global ip_listglobal starpingjia = ""# 请求头header = {'Host': 'www.meituan.com','User-Agent': user_agents[random.randint(0, len(user_agents)-1)],}data = requests.get(url, headers=header, proxies=ip_list[random.randint(0, len(ip_list) - 1)])try:for i in range(len(data.json()['data']['comments'])):# 评价pingjia += data.json()['data']['comments'][i]['comment']# 星数star += data.json()['data']['comments'][i]['star']return pingjia# 获取评价失败重新获取IP和数据except KeyError:ip_list.clear()get_ip()get_data(url)

5. 生成词云
找一张美团logo作为底图


```# 生成词云
def ciyun(pingjia):img_bg = np.array(Image.open("D:\\vscode\\My_Code\\meituanpinlun\\logo.png"))  # 打开图片# 分词data_jieba = jieba.analyse.extract_tags(pingjia, topK=1000, withWeight=True, allowPOS=())data = {a[0]: a[1] for a in data_jieba}  # 将数组形式转换为字典ciyun = WordCloud(font_path='C:\Windows\Fonts\simhei.ttf',  # 设置字体路径background_color="white",  # 背景色max_words=1000,  # 显示词语的最大个数max_font_size=300,  # 最大字体大小width=1920,  # 输出的画布宽度height=1048,  # 输出的画布高度scale=5,  # 长宽拉伸程度程度设置mask=img_bg  # 设置图片蒙版).generate_from_frequencies(data)  # 根据词频生成词云plt.figure(figsize=(12, 12))  # 创建图形并设置画布大小plt.imshow(ciyun, interpolation='bilinear')plt.axis("off")  # 不显示坐标file_name = os.path.basename(__file__)file_path = os.path.splitext(file_name)[0]ciyun.to_file("{0}\平均{1}颗星.png".format(file_path, star))  # 保存文件plt.show()

完整代码

# coding=utf-8'''获取美团商家评价并生成词云'''
import json
import random
import requests
import sys
import os
import re
import time
import jieba.analyse
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from http import cookiejar# 浏览器标识
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36']# 存放IP
ip_list = []
# 商家评价星数
star = 0
# 美团cookie
cookie_str = ""# 获取代理IP
def get_ip():global ip_listip_shumu = 0ip_chengg = 0# 请求头header = {'User-Agent': user_agents[random.randint(0, len(user_agents)-1)],'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Host': 'www.89ip.cn'}# 获取页数print('获取IP中。。。')for i in range(1, 2):ip_url = 'http://www.89ip.cn/index_{}.html'.format(i)try:ip_html = requests.get(ip_url, headers=header)except ConnectionError:time.sleep(2)ip_html = requests.get(ip_url, headers=header)if ip_html.status_code == 200:print("连接IP代理网站成功。。。")# 替换掉HTML的空格和换行html = ip_html.text.replace(" ", "").replace("\n", "").replace("\t", "")# 匹配IP和端口的正则表达式r = re.compile('<tr><td>(.*?)</td><td>(.*?)</td><td>')# 匹配到的IP与端口ip_data = re.findall(r, html)ip_shumu += len(ip_data)for k in range(len(ip_data)):# 拼接IP与端口ip = "https://" + ip_data[k][0] + ":" + ip_data[k][1]ip_a = {"https://": ip}# 测试可不可用ping = requests.get("https://www.baidu.com", proxies=ip_a)if ping.status_code == 200:ip_list.append(ip_a)ip_chengg += 1print('获取到的IP数:{0}\n有效的IP数:{1}'.format(ip_shumu, ip_chengg))# 获取美团cookie
def get_cookie():global cookie_strheader = {'Host': 'www.meituan.com','User-Agent': user_agents[random.randint(0, len(user_agents)-1)],}a = 0while True:cookie_req = requests.get("https://gz.meituan.com/s/", headers=header, proxies=ip_list[random.randint(0, len(ip_list) - 1)])if cookie_req.status_code != 302:breaka += 1# 重试次数过多重新获取IPif a == 10:ip_list.clear()get_ip()a = 0cookie_dic = requests.utils.dict_from_cookiejar(cookie_req.cookies)for key in cookie_dic:for val in cookie_dic.values():cookie_str += key + '=' + val# 获取美团商家ID
def get_shangjia(shangjia):header = {'User-Agent': user_agents[random.randint(0, len(user_agents)-1)],'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Cookie': cookie_str,'Host': 'gz.meituan.com','Upgrade-Insecure-Requests': '1',}url = "https://gz.meituan.com/s/{0}/".format(shangjia)for i in range(len(ip_list)):# 请求get_html = requests.get(url, headers=header, proxies=ip_list[i])# 替换掉空格换行html = get_html.text.replace(" ", "").replace("\n", "")try:# 匹配到错误信息进行下一轮循环re.search(r'error-word', html).group()continueexcept AttributeError:break# 匹配IDr = re.compile(r'data-poiid="[1-9]\d*"',)a = re.findall(r, html)try:return re.search(r'[1-9]\d*', a[0]).group()# 获取页面失败except IndexError:ip_list.clear()get_ip()get_shangjia(shangjia)# 获取美团商家评价
def get_data(url):global ip_listglobal starpingjia = ""# 请求头header = {'Host': 'www.meituan.com','User-Agent': user_agents[random.randint(0, len(user_agents)-1)],}data = requests.get(url, headers=header, proxies=ip_list[random.randint(0, len(ip_list) - 1)])try:for i in range(len(data.json()['data']['comments'])):# 评价pingjia += data.json()['data']['comments'][i]['comment']# 星数star += data.json()['data']['comments'][i]['star']return pingjia# 获取评价失败重新获取IP和数据except KeyError:ip_list.clear()get_ip()get_data(url)# 生成词云
def ciyun(pingjia):img_bg = np.array(Image.open("D:\\vscode\\My_Code\\meituanpinlun\\logo.png"))  # 打开图片# 分词data_jieba = jieba.analyse.extract_tags(pingjia, topK=1000, withWeight=True, allowPOS=())data = {a[0]: a[1] for a in data_jieba}  # 将数组形式转换为字典ciyun = WordCloud(font_path='C:\Windows\Fonts\simhei.ttf',  # 设置字体路径background_color="white",  # 背景色max_words=1000,  # 显示词语的最大个数max_font_size=300,  # 最大字体大小width=1920,  # 输出的画布宽度height=1048,  # 输出的画布高度scale=5,  # 长宽拉伸程度程度设置mask=img_bg  # 设置图片蒙版).generate_from_frequencies(data)  # 根据词频生成词云plt.figure(figsize=(12, 12))  # 创建图形并设置画布大小plt.imshow(ciyun, interpolation='bilinear')plt.axis("off")  # 不显示坐标file_name = os.path.basename(__file__)file_path = os.path.splitext(file_name)[0]ciyun.to_file("{0}\平均{1}颗星.png".format(file_path, star))  # 保存文件plt.show()if __name__ == "__main__":get_ip()get_cookie()shangjia = input("输入商家全称:")shumu = input("输入需要查看的评论数目:")shangjia_ID = get_shangjia(shangjia)url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?{0}&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F{1}%2F&riskLevel=1&optimusCode=10&id={1}&userId=&offset=0&pageSize={2}&sortType=1".format(cookie_str, shangjia_ID, shumu)pingjia = get_data(url)# 计算平均评分star = (star / 10)/int(shumu)ciyun(pingjia)

注意

  1. get_cookie()与get_shangjia()函数中的URL地址需要根据商家地区进行切换,gz代表着广州(本文获取商家评论是建立在广州地区进行获取),程序会根据URL地址会查询相应的地区

成品

获取美团商家评论词并生成词云相关推荐

  1. python制作词云图设置停用词,Python生成词云图

    代码如下: from os import path from wordcloud import WordCloud import matplotlib matplotlib.use('TkAgg') ...

  2. Python——爬取某瓣电影评论信息并生成词云图

  3. python爬音乐评论生成词云图_python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  4. 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例

    爬取qq音乐的评论并生成词云 我们选取的是歌曲的周杰伦的 听妈妈的话 先看效果图 首先,我们进去qq音乐找到这首歌 网易云出来挨打 https://y.qq.com/n/yqq/song/002hXD ...

  5. scrapy框架下的豆瓣电影评论爬取以及登录,以及生成词云和柱状图

    由于豆瓣在今年5月份已经禁止展示所有短评,只展示最热的500条数据,并且在爬取到240条的时候,如果没有登录的话,会提示登录. 因此几天的爬虫,包括豆瓣的自动登录和数据爬取后批量存入pymysql数据 ...

  6. 抓取网易云音乐歌曲热门评论生成词云(转)

    非原创作品,转载自:http://blog.csdn.net/marksinoberg/article/details/70809830 前言 网易云音乐一直是我向往的"神坛",听 ...

  7. 抓取网易云评论,生成词云图

    非原创作品,转载自:http://blog.csdn.net/marksinoberg/article/details/70809830 前言 网易云音乐一直是我向往的"神坛",听 ...

  8. 爬取京东评论并生成词云

    import os import time import json import randomimport jieba import requests import numpy as np from ...

  9. Python入门--爬取淘宝评论并生成词云

    Python爬取淘宝评论并生成词云 最新修改于2021/04/01 所需相关Python第三方库(目前最新版本即可) 推荐使用Anaconda,其使用十分方便.快捷. requests库 json库 ...

  10. python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——小猿搜题

    python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--小猿搜题 # 导入扩展库 import re # 正则表达式库 import collections ...

最新文章

  1. laravel Collection mapToDictionary 例子
  2. dump导入oracle需要提前建表吗_数据库dump导入
  3. pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma
  4. php怎么写for循环,PHP for循环的写法和示例
  5. Windows 计划任务
  6. 大数据如何推动医疗行业的发展
  7. 算法习题---4-5IP网络(Uva1590)
  8. hdu2108 判断是凸多边形还是凹多边形
  9. 【随笔】我的两年 ACM 回(心)忆(酸)录(路) 【多图预警】
  10. 【数据结构与算法分析】证logXX 对所有的X0成立
  11. 我要砍价-自动砍价-思路
  12. NetworkInterface网速监测
  13. 美颜SDK多少钱一年?视频美颜SDK的价格由哪些因素影响?
  14. 厚积薄发 | 游戏引擎十年技术点滴
  15. java 绝对路径双斜线_路径分隔符:正斜线/、反斜线\、双反斜线\\的区别
  16. Atcoder 284题解
  17. Spring框架基础学习小结。概念,文件配置
  18. 国内云存储厂商酷盘宣布获2000万美元B轮投资
  19. python 调用qrcode库实现二维码识别
  20. 从原理到接法全面了解三相电

热门文章

  1. AIDE手机编程初级教程(零基础向)导航
  2. 群晖消息通知 推送服务器,群晖NAS发送钉钉群消息通知教程
  3. 西门子1200伺服步进FB块程序 含触摸屏程序,SCL写的FB块,中文注释详细
  4. ../bin/testCurveFitting 出现的错误以及解决办法
  5. SVN汉化包安装方法
  6. SVN客户端安装及汉化
  7. 树莓派4B使用移远EC20带GPS 4G模块ppp拨号上网
  8. Python数据分析之理论知识
  9. 模拟银行转账(java+mysql+tomcat +JDBC+ druid连接池 + Servlet + Ajax)
  10. 私塾在线精品原创系列文章