用Python爬取京東商品評論(2)

利用Python爬取京東評論

首先打開京東的頁面,輸入你想要查找的某項商品的名稱,這裏用貝因美的某一款奶粉舉例這裏寫圖片描述

下拉點開商品評論,可以看到本商品的對應評論。現在我們的目的就是利用爬蟲來獲取這些評論。接下來詳細講一下爬取得過程。

1.首先我們右擊選擇查看網頁源代碼。

在(1)中我們講利用BeautifulSoup在源代碼中對標籤進行層層的篩選來獲取我們希望獲得的信息。於是首先我們查看商品評論所對應的節點標籤,但是我們會發現,在源代碼中我們是找不到對應商品的評論的。因爲對於動態網頁的加載,在利用源代碼部分書寫網頁時,是不能直接寫下來。正如我們使用瀏覽器時也會發現,有些網頁的加載是在我們一邊下拉的時候一邊動態加載的,在這裏對於商品的評論也是一樣。商品的評論總會實時更新,是無法直接在構建網頁的時候變現出來的。這個時候,我們就需要利用瀏覽器的開發者選項(或者右擊選擇檢查,或者直接按F12)對包含在網頁中的其他信息進行查找。

2.利用開發者選項找到評論保存的網址

在開發者選項的上面有很多屬性,首先我們選擇Element屬性,可以發現,這裏的內容也就是我們之前查看的網頁源代碼的內容。接着選擇Network屬性(如果顯示內容爲空,刷新一下讓網頁重新加載即可),可以在右邊看到很多文件,這些也是網頁加載時所包含的文件。我們希望獲得商品的評論,所以我們就看看在這些文件裏,有沒有哪一個是專門用來保存商品評論的。我們找到

根據英文名可以看出這個可能是商品的Comment.
再看右邊的Headers
這裏寫圖片描述
我們嘗試打開這個URL
這裏寫圖片描述
可以驚喜的發現這裏面就是我們希望爬取得評論內容。至此,我們就找到了京東對於商品評論說保存的網頁地址,我們接下來對評論的爬取就是對該網頁進行爬取。

3.利用params參數構建網址

我們找到了網址,接下來就是對該網址的內容進行爬取。很明顯,對於每一頁的評論都會一個新的網址,我們不可能單獨的只對單一的網址評論進行爬取,我們需要對多頁評論進行爬取。這個時候我們就需要構建網頁的網址內容,來靈活的構建網址。這裏同樣也要用到requests模塊以及上文講到的開發者選項。
首先我們需要調用requests.session()函數來構造一個網頁請求的會話。相關的內容可以參考
Requests 2.18.1 文檔

接下來我們就可以利用會話返回的對象調用get()方法來構建網址,這個方法可以通過params屬性在網址後面添加需要的內容。所以我們現在需要知道對於評論的網址,我們需要構建哪些參數值。
回到評論的網頁,觀察網頁的地址https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv75454&productId=1601354&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
我們可以發現
callback=fetchJSON_comment98vv75454&productId=1601354&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1 這些都是可以添加在後面的參數值。那麼我們現在的任務就是如何獲取網頁的這些參數值。
我們在回到剛剛打開的開發者選項,在Headers下還有其他的內容,我們找到
這裏寫圖片描述
可以發現這裏包含了我們剛剛所提到的所有屬性值。也就是說,只要我們能獲取這些屬性值,並將它添加到https://sclub.jd.com/comment/productPageComments.action? 的後面,我們就可以構建網址了。

那如何獲取這些屬性值呢?這就又回到了我們之前說的正則表達式模塊的內容,正則表達式對文檔信息的檢索和字符串的查找很有用。但是這裏,我們可以簡化一下,並不是每個參數都需要獲取對應的值。這裏簡單說一下每個屬性的意義:
callback:是網頁響應採用的json格式,這個一般不相同也不會有太大問題,這裏可以默認它的屬性值就是這個。

productId: 商品的Id編號
score:對應於評論的情感程度。0是好評,1是差評,2是中評
sortType:5是按推薦排序,6是按時間排序
page:對應評論的第幾頁
pageSize:默認值爲10
isShadowSku:默認爲0
fold:默認爲1
所以這裏其實我們真正要獲取的就是productId,其他的設爲默認值就可以。

所以我們利用正則表達式獲取到對應的productId後,構建一個字典來保存對應的鍵和值
代碼如下:

    #要訪問網頁所需要的參數值(可以通過F12查看)
    data = {
            'callback':'fetchJSON_comment98vv777',
            'productId':'',
            'score':'0',
            'sortType':'6',
            'page': 0,
            'pageSize': 10,
            'isShadowSku':0,
            'fold':1
    }

將用正則表達獲取的productId添加到字典中,並將data作爲params屬性的值添加到get()函數中,就可以最終完成我們對網址的構建,代碼如下:

http = 'https://sclub.jd.com/comment/productPageComments.action'
t = s.get(http, params = data).text

返回值t就是我們構建的評論網址的內容。最後我們只要在爬取完每一頁之後都使page值加1,就可以最終實現對評論的多頁爬取。

4.將網頁內容轉化成json格式

觀察評論網頁的內容我們可以看出,京東很貼心的把評論網頁的內容構建成了易於處理的json格式,但是用.text返回的內容有時候可能會在網頁的開頭包含一些其他東西,如果當我們發現返回的內容不能直接json來處理時,這時,就需要進行一些清理,除去一些不必要的部分,保留Json的部分。這裏,同樣要用到正則表達式模塊。
我們利用正則表達式,去除頁面開頭中的字母和括號,只保留從第一個大括號開始的內容。代碼如下:

rex=re.compile(r'\w+[(]{1}(.*)[)]{1}')      #提取出JSON格式
cont = rex.findall(t)[0]        
con = json.loads(cont)      #將爬取下來的內容轉化成可以被json解析的字典格式

5.利用字典屬性獲取對應評論的內容

觀察我們構建好的json格式的內容(con)可以通過鍵-值清楚的找到評論所對應的鍵,於是我們就可以通過遍歷鍵來獲取所有的評論。代碼如下:

cout = len(con['comments'])
for i in range(cout):
    comm_time = []
    comm = con['comments'][i]['content']        #獲取評論
    ti_me = con['comments'][i]['creationTime']      #獲取評論時間
    comm_time.append(ti_me)
    comm_time.append(comm)

通過以上的分析和步驟,我們最終可以獲得商品的評論。這種方法或許不是唯一的,但是可以作爲在爬取少量評論時的思路和代碼。

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