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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章