python爬虫之通过pyquery爬取大众点评评论信息

写作缘由:朋友求助帮忙爬取一下大众点评天河商圈的商户名, 店铺收藏量, 评论数量, 好评数, 差评数, 口味评分, 环境评分,服务评分, 人均价格, 首页优质评论数。
思路

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

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值