获取大众点评网的店铺评论,我们一般有以下几个途径:1、PC端网页端;2、小程序端;3、APP端;PC端由于有字体加密,采集时需要对加密的字体进行解密,具体思路可以参考:爬虫方案 | 爬取大众点评网评论的几个思路(从PC端) – 富泰科 (futaike.net)
本篇我们尝试从小程序端来获取:
工具:
1、fiddler软件:抓包使用;
2、python
首先我们从电脑微信打开小程序,开启fiddler,定位到评论页面,我们可以看到抓取到数据包。
我们可以看到,返回的是JSON字符串,那我们拿到以后解析一下就可以了。
那么抓取思路有了,我们可以先用fiddler把Response body全部获取下来,保存。
然后再对JSON内容进行解析。OK,我们下面就来写代码:
def get_comments(self, shop_name, file_name): # shop_name = self.get_info() # # 从response中提取数据 self.item_list = [] file = open(f'D:/Fiddler Sessions/dianping_pinglun_{shop_name}.txt', 'r', encoding='utf-16 LE').readlines() for i in file: # 循环
reviewList = reviewData['reviewList'] big_url_list = [] for review in reviewList: if not has_next: print('没有数据了,采集完成。') # user userId = review['userId'] userNickName = review['userNickName'].replace('"', '') # 年月日格式化 lastTimeStr = review['lastTimeStr'] lasttime = review['addTime'].split('-')[0] lasttime = lasttime + '年' + lastTimeStr # 转成年月日格式 # 浏览数 browse_count = review['browseCountStr'] # 赞数 flower_count = review['flowerTotalStr'] # 评论数 follow_Note_count = review['followNoteNoStr']
这样就拿到了相关字段,评论的内容是分开的,和PC端的不一样,没有字体加密,那我们就可以直接获取了。
content = review['reviewBody']['children'] content_text = [] for item in content: for k, v in item.items(): if k == 'children': for sub_item in v: text = sub_item.get('text', '').replace('\n', '。').replace('\r', '') content_text.append(text)
这里我们要处理一下换行符,替换一下即可。
然后,我们还要处理一下评论内容当中的表情符号,这里我们导入一个转换的模块,叫
import emoji
使用当中的这个函数demojize:
content = ' '.join(content_text) content = emoji.demojize(content)
然后我们就可以将一些表情符号转为字符了。
我们先尝试抓取一下,打印一下,OK,没有问题。
下面再来处理一下翻页,翻页参数需要用到很多的加密参数,美团对这块实在是用力,我们小白用户偶尔抓一次数据,哪有这个能力去破解这么多的加密呢?
看看这么长的加密参数,是不是就头大了。那我们小白就干脆不理它,还不行吗?不让我们使用参数翻页,我们就笨一些,咱们手动翻页不就得了。
下面我们就请出python库当中的另一个模块,pyautogui,让它帮我们去滚动小程序页面,翻页加载。
我们的思路是运行以后让鼠标自动跑到小程序界面,然后再滚动向下,进行翻页,一直翻到没有数据为止。这里我们首先要在小程序上截一个图,让模块在程序运行时比对这个图,找到小程序对应的位置,然后再滚动,滚动的次数我们可以根据评论的最大页数以及每次加载的条数来计算一下,给一个最大的滚动次数。还可以加一个break条件来终止这个循环,比如滚动到最后有一个,没有更多数据的提示,那我们就可以使用这个来作为循环停止的条件。
def scroll_down(self, max_num): # 滚动加载评论内容。 # 辅助滚动 max_pages = max_num / 10 # 找到小程序中心坐标 location = pyautogui.locateOnScreen( r'C:/Users/Administrator/Pictures/futaike.net_1211_213052.jpg') print('小程序坐标:', location) loc = pyautogui.center(location) # 找到图片的中心,返回的是元组 pyautogui.PAUSE = 5 # 暂停5秒
我们定义一个滚动函数:
# 循环滚动 page = 0 while True: for i in range(4): # 循环滚动 pyautogui.scroll(-1500) pyautogui.PAUSE = 1 # 暂停1秒 page += 1 try: stop_loc = pyautogui.locateOnScreen( r'C:/Users/Administrator/Pictures/futaike.net_1212_105822.jpg') stop_flag = pyautogui.center(stop_loc) except Exception as e: stop_flag = () if stop_flag: break if page > max_pages * 2: break print(page)
这样我们就解决了翻页的大问题。下面就是获取数据,然后解析保存了。
保存格式可以使用excel的xlsx,或csv等,如果csv需要对换行符以及,半角字符进行预处理一下。这些都比较简单,使用replace替换一下即可。
当然,这里我们还要可以考虑重复数据的去重,可以使用以下的列表去重函数:
# 去除列表当中的重复值 item_list = [] for r in range(len(item_list) - 1, -1, -1): # 比较 for c in range(r): if item_list[r] == item_list[c]: del item_list[r]
然后再将去重后的数据导出(以xlsx示例):
self.item_list.append([shop_name, UUid, str(reviewTotalCount), str(userId), userNickName, lasttime, content, str(star), avgPrice, str(flower_count), str(follow_Note_count)]) xlsxwriter.excel_save(f'{file_path}/{shop_name}_大众点评评论.xlsx', self.item_list, self.excel_head)
然后我看所有的表情符号也都转为字符了。
好了,以上就是我们从小程序端抓取点评评论的全部思路及实施过程。
微信扫描下方的二维码阅读本文