赞
踩
写作缘由:朋友求助帮忙爬取一下大众点评天河商圈的商户名, 店铺收藏量, 评论数量, 好评数, 差评数, 口味评分, 环境评分,服务评分, 人均价格, 首页优质评论数。
思路:
1. 我们发现大众点评是需要我们模拟浏览器向服务器发起请求,比如我们设置了头信息中的Cookie等头信息,这样服务器就会以为我们是通过浏览器登录账户进行访问的,不会把我们列入机器人爬虫,所以需要headers请求头。
- headers = {
- 'Host': 'www.dianping.com',
- 'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36",
- 'Accept-Encoding': 'gzip',
- 'Cookie' : 'xxxxxx'#xxxxxx为电脑中自己登陆时的cookie值
- }
2. 根据天河商圈的URL:http://www.dianping.com/guangzhou/ch10/r22p%s,我们发现,天河商圈大概有50个页面,我们只需要遍历50次,修改URL中末尾处的%s从1到51即可。
3. 根据页面显示的源代码,我们可以根据css的定位获取到每个页面的中每个商铺的ID,根据ID,我们可以利用URL:http://www.dianping.com/shop/%s/review_all,修改URL中%s为商户的ID。
即解析的代码块为:
- # 解析id
- shangId1 = doc("div.content > div.shop-list.J_shop-list.shop-all-list > ul > li").items()
- for data in shangId1:
- shopId = data("div.txt >div.tit > a").attr("data-shopid")
- listShop.append(shopId)
4. 根据单个商铺的页面显示的源代码,我们可以根据css的定位获取到商户名,评论数量,好评数, 差评数, 星级, 口味评分, 环境评分,服务评分, 人均价格以及所有评论信息。我们发现解析的数据比如:好评数:(1250),这里面包含了一些与之无关的字符,我们可以通过正则表达式将数字部分匹配出来。
即解析的代码块为:
- # 商户名
- shopName = doc1("div.review-list-header > h1 > a").text()
- print("商户名:" + shopName)
- # 评论数量
- #re.sub("\D", "", reviewsSum):正则表达式将获取到的数据reviewsSum将匹配数字部分提取出来
- reviewsSum = doc1("div.rank-info > span.reviews").text()
- reviewsSum = re.sub("\D", "", reviewsSum)
- print("评论数量:" + reviewsSum)
- # 好评数
- goodSum = doc1("div.filters > label.filter-item.filter-good > span.count").text()
- goodSum = re.sub("\D", "", goodSum)
- print("好评数:" + goodSum)
- # 差评数
- badSum = doc1("div.filters > label.filter-item.filter-bad > span.count").text()
- badSum = re.sub("\D", "", badSum)
- print("差评数:" + badSum)
- # 口味评分
- kwSum = doc1("div.rank-info > span.score :first-child").text()
- print("口味评分:" + kwSum[3:])
- # 环境评分
- hjSum = doc1("div.rank-info > span.score :nth-child(2)").text()
- print("环境评分:" + hjSum[3:])
- # 服务评分
- fwSum = doc1("div.rank-info > span.score :last-child").text()
- print("服务评分:" + fwSum[3:])
- # 人均价格
- priceSum = doc1("div.rank-info > span.price").text()
- priceSum = re.sub("\D", "", priceSum)
- print("人均价格:" + priceSum)
5. 根据要求:3张图片+150个文字以上算优质评论,我们解析了评论,用了上述的定位方法,并且我们发现解析的评论中带有"收起评论"、" "、"\n",我们通通将其转换成"",再计算评论的长度。
- # 解析评论
- pinglunLi = doc1("div.reviews-items > ul > li").items()
- for data in pinglunLi:
- # 首页每个评论长度
- pinglunShop = len(data("div > div.review-words").text().replace("收起评论", "").replace(" ", "").replace("\n", ""))
- print("首页每个评论长度" + str(pinglunShop))
- # 首页每个图片个数
- imgShop = data("div > div.review-pictures > ul > li> a").items()
- imgList = 0
- for key in imgShop:
- imgList = imgList + 1
- print("首页每个图片个数" + str(imgList))
- # 3张图片+150个文字以上算优质评论
- if pinglunShop >= 150 and imgList > 3:
- goodReviews = goodReviews + 1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。