1. 程式人生 > >識別山寨不再難!快用Python爬評論,無需再等315

識別山寨不再難!快用Python爬評論,無需再等315

之前我水平有限,對於淘寶評論這種動態網頁,由於資料在網頁原始碼中是找不到的,所以無法抓取資料,只能使用selenium模仿人操控瀏覽器來抓資料,

優點是可見容易且不宜被淘寶公司封鎖;缺點是速度太慢。

經過今天一天的鑽研,終於學會分析資料包,而且淘寶評論的資料包都是以json格式傳輸的。除了學會抓包,還要會從json中提取出想要的評論資料才行。

有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875,反正閒著也是閒著呢,不如學點東西啦~~

本文實現難點:

一、分析資料包,找到淘寶評論傳輸用的網址,分析網址特點

二、如何從找到的資料包中,從json格式內容中得到想要的資料

案例

https://detail.tmall.com/item.htm?id=38975978198&ali_refid=a3_430582_1006:1106461044:N:%E7%94%B5%E5%8A%A8%E7%89%99%E5%88%B7:bfee1d767fa0a91e5e853b29d794c6f2&ali_trackid=1_bfee1d767fa0a91e5e853b29d794c6f2&spm=a230r.1.14.1.R0FzCm

開啟該網址,點選評論

如圖中紅色圈中的評論,分析發現,在網頁原始碼中查詢不到。

找啊找,找啊找,圈中的評論就是不在網頁原始碼中。那只有一種可能,在我們看不到的方式傳送。

用火狐瀏覽器,開啟開發者工具,點選網路

                                             

真的找到了啊

那麼接下來我們要知道這個包傳遞資訊的網址

點選訊息頭,紅方框中的請求網址就是這個評論資料包傳遞的網址

網址如下

https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&spuId=279689783&sellerId=92889104&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=250UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt+RH9FfEZ6QXpEcCY=|U2xMHDJ+H2QJZwBxX39RaVV7W3UyWzAeSB4=|VGhXd1llXGlTaFJrUW1WbVNnUG1PdkN7TnBNeUxzR3pFeEB/QG44|VWldfS0TMwc4BycbIwMtBn0AbSJNNl87ZBVaMRo6FEIU|VmhIGCIWNgsrFy4XKgo0ATkDIx8mHyICNgs2FioUIBo6DjMOWA4=|V25OHjBVPF07RT5XLgAgFCEUNAgxCDQULRAoHUsd|WGFBET8RMQ02Di4SKhIvDzQJNAoxZzE=|WWBAED5bMlM1SzBZIA4uGy4VNQkxCzISJhwjGCN1Iw==|WmNDEz1YMVA2SDNaIw0tES0QLw8zCzIIKBwmHCMWQBY=|W2JCEjxZMFE3STJbIgwsEicbOwc+AToaJhoiFi0RRxE=|XGVFFTteN1YwTjVcJQsrEisePgI8CDERLRkmEiseSB4=|XWREFDpbJksuYgZvFXUwWjhVPkNtTXZKclJuUWhUdEt2SXRAfCp8|XmdHFzkXNws3Az4eIh4rFDQLNg8xBThuOA==|X2ZGFjgWNgkxDy8TKh8hAT4DOAY9B1EH|QHlZCSdMK09uA3IPdB0zEy8TLRMzDzAFORkmGyAUKx5IHg==|QXlZCSdCK0osUilAORc3Z1ltVHRIdk96LAwxET8RMQ4wBTAOO207|QnpaCiQKKnpDeUFhXWFZYUF4RH1dYVt7R3hNbVFqPBwhAS8BIRgnEywRLHos|Q3pHelpnR3hYZF1hQX9HfV1kRHhFZVFxRGRefkVlXX1EZFp6RWVZeU1tWA4=&isg=Anl5FLTxBcTYINlX61XKverNieN0fW04cSauNZurS6AfIpO049emCPMw0pst&needFold=0&_ksTS=1487675147352_694&callback=jsonp695

看起來網址太長,太複雜(稍安勿躁),那麼先複製網址,在瀏覽器上開啟看看是什麼東西

複雜的網址中,有些亂七八糟的可以刪除,有意義的部分保留。切記刪除一小部分後先嚐試能不能開啟網頁,如果成功再刪減,直到不能刪減。最後保留下來的網址,如下

https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&spuId=279689783&sellerId=92889104&order=3&callback=jsonp698&currentPage=1

currentPage=1意思是當前頁碼是第一頁。如果改動為currentPage=3表示是第三頁。

好了,下面是程式碼

import requests
import json
import simplejson

headers = {
'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0'
}

base_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&' \
'spuId=279689783&sellerId=92889104&order=3&callback=jsonp698'
#在base_url後面新增&currentPage=1就可以訪問不同頁碼的評論

#將響應內容的文字取出
tb_req = requests.get(base_url, headers=headers).text[12:-1]

#將str格式的文字格式化為字典
tb_dict = simplejson.loads(tb_req)

#編碼: 將字典內容轉化為json格式物件
tb_json = json.dumps(tb_dict, indent=2)   #indent引數為縮緊,這樣打印出來是樹形json結構,方便直觀

#解碼: 將json格式字串轉化為python物件
review_j = json.loads(tb_json)

#這裡的0是當前頁的第一個評論,每頁面其實是有20個評論的
print(review_j["rateDetail"]["rateList"][0]['rateContent'])

上面只是抓了一個評論。下面是抓取近100頁的網頁所有評論,程式碼如下有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875,反正閒著也是閒著呢,不如學點東西啦~~

import requests
import json
import time
import simplejson
'''
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875,反正閒著也是閒著呢,不如學點東西啦~~
'''

headers = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0'
}
base_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&' \
           'spuId=279689783&sellerId=92889104&order=3&callback=jsonp698'
#在base_url後面新增&currentPage=1就可以訪問不同頁碼的評論

for i in range(2, 98, 1):
    url = base_url + '&currentPage=%s' % str(i)
    #將響應內容的文字取出
    tb_req = requests.get(base_url, headers=headers).text[12:-1]
    print(tb_req)

    #將str格式的文字格式化為字典
    tb_dict = simplejson.loads(tb_req)

    #編碼: 將字典內容轉化為json格式物件
    tb_json = json.dumps(tb_dict, indent=2)   #indent引數為縮緊,這樣打印出來是樹形json結構,方便直觀
    #print(type(tb_json))

    #print(tb_json)
    #解碼: 將json格式字串轉化為python物件
    review_j = json.loads(tb_json)
    for p in range(1, 20, 1):
        print(review_j["rateDetail"]["rateList"][p]['rateContent'])
    time.sleep(1)