欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-18 21:25:47
...

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

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即可。

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


3. 根据页面显示的源代码,我们可以根据css的定位获取到每个页面的中每个商铺的ID,根据ID,我们可以利用URL:http://www.dianping.com/shop/%s/review_all,修改URL中%s为商户的ID。

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


即解析的代码块为:

 # 解析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),这里面包含了一些与之无关的字符,我们可以通过正则表达式将数字部分匹配出来。

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

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

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


即解析的代码块为:

# 商户名
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