如题 分析并爬取美团单个店铺的评论
该文章仅供交流使用,请勿非法使用,如有侵犯,请联系删帖。
一.分析
随便在首页选了一家店铺,链接我这边就不放了,这边重要的是分析过程。
打开谷歌浏览器的开发者工具,然后在包的类型那里进行筛选(红色方框标注),或者也可以在过滤器搜索我们要找的评论关键词(圆圈,这些关键词是对应筛选链接的)
店铺页面返回的内容中并没有与评论相关的数据,推断这些评论数据不在document里面,那么可以在包的筛选中选择xhr,然后寻找跟comment有关的链接
可以发现找到了3条链接,分别点进去看返回数据,可以发现里面是评论的数据,返回的是json格式,那么提取方式就可以很方便,然后分析链接的一些参数,为了发现参数是否有变动,刷新了几次,对比发现除了页数,其他并没有改变,而页数的改变也是以每页10个设定
而其中uuid是一个不变的参数,而获取的方式是在店铺首页的返回数据中,是一个固定值
分析就到这里,具体实现情况在下面代码
二.代码
[Python] 纯文本查看 复制代码 import requests
import time
def timeStamp(timeNum):
timeStamp = float(timeNum) / 1000
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return otherStyleTime
def get_comments(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
#提取店铺id
shop_id = url.split("/")[-1]
#应对在链接后面有/的情况
if shop_id == "":
shop_id = url.split("/")[-2]
session = requests.session()
#关闭长链接,也可以在headers里面加上Connection: close
session.keep_alive = False
res = session.get(url, headers=headers)
#提取店铺首页返回的cookie值,提取方式有很多,网上有介绍,我这里是直接通过方法转为字典
cookie = res.cookies.get_dict()
#然后利用for循环取出,后面range是设定页数,这个店铺有995页
error_count = 0
comment_list = []
for i in range(995):
comment_url = f"https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=060423b2a0b04ed3a54d.1610609373.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F{shop_id}%2F&riskLevel=1&optimusCode=10&id={shop_id}&userId=&offset={i * 10}&pageSize=10&sortType=1"
#返回的数据是json格式,那么直接返回json,然后进行提取
time.sleep(3)
try:
res = session.get(comment_url, headers=headers, cookies=cookie).json()
except Exception as e:
error_count += 1
res = {}
print(f"Error:{e}")
#出错10次,就自动跳出循环
if res == {}:
if error_count >= 10:
print(f"Warning:程序出现异常")
break
else:
continue
else:
data_list = res['data']['comments']
for data in data_list:
#用户名
userName = data['userName']
#评论内容
comment = data['comment']
#套餐
menu = data['menu']
#处理评分
star = int(data['star']) / 10
#转换时间
commentTime = timeStamp(data['commentTime'])
#其他提取的内容可自己添加
#设定的数据提取方式也可以使用字典,这边是使用元组加列表的形式
comment_data = userName, comment, menu, star, commentTime
print(comment_data)
comment_list.append(comment_data)
return comment_list
if __name__ == '__main__':
#"https://www.meituan.com/meishi/1467844/"
get_comments("https://www.meituan.com/meishi/1467844/")
|