1. 程式人生 > >爬取京東評論資訊

爬取京東評論資訊

一,爬蟲需求分析

1,需求。

  我們需要獲取多個連結的白酒在2018年評論數量。

2,分析。

  一個商品頁面有好幾個規格,如圖:

評論區我們需要獲取的資料是當前選擇的商品,而且需要時間順序為2018年的:

這時候得到的評論有很多頁,我們需要一條條的去爬取。

二,誤區

因為時間排序以及當前商品評論的限制,我們選擇了Selenium作為爬蟲工具,寫了很久發現時間排序的那個地方不是<select>標籤,在標籤選取上出現了問題,所以放棄了該方法。

三,productPageComments實現

1,選擇本方法的原因

  我們發現我們需要爬取的連結中都有商品ID,而不同規格的商品ID也不同,如果用productPageComments獲得評論的話那麼相當於解決了僅獲取當前商品評論的問題,現在只需要完成2018評論數量的限制了。

2,實現

  通過依此讀取連結的方法用for迴圈頁數爬取所有的評論。要是獲取的productPageComments中沒有評論咋辦?只需要讓前N頁的評論總數與前N-5頁對比,若沒變化,則說明後面都沒有評論了,程式停止。

  2018的限定只需要把爬取的日期取前4位,然後用正則匹配2018即可。

1     for i in data['comments']:
2         #name = i['referenceName'] #酒的種類
3         time_comment = i['creationTime'][0:4]  #只選擇評論時間的年份,若為2018開頭則符合要求
4 time_comments.append(time_comment) 5 total_com_num.append(time_comments.count("2018")) #[每頁的評論數],所以得注意所以頁碼如何處理?

3,總程式碼

 1 import requests
 2 import json
 3 import re
 4 
 5 total_com_num = []  #用於計算總評論數
 6 def getcontent(url):
 7     productPageComments = requests.get(url)
8 data = json.loads(productPageComments.text[26:-2]) #translate to json 9 10 time_comments = [] #本容器用於篩選出時間正確的商品 11 for i in data['comments']: 12 #name = i['referenceName'] #酒的種類 13 time_comment = i['creationTime'][0:4] #只選擇評論時間的年份,若為2018開頭則符合要求 14 time_comments.append(time_comment) 15 total_com_num.append(time_comments.count("2018")) #[每頁的評論數],所以得注意所以頁碼如何處理? 16 return sum(total_com_num) #返回前i頁(note:這個i是page的i)下評論總數。 17 18 if __name__ == '__main__': 19 link_list = [] 20 f = open("1.txt") # 返回一個檔案物件 21 lines = f.readlines() # 呼叫檔案的 readline()方法 22 for line in lines: 23 link_list.append(line) 24 25 # link = "https://item.jd.com/21391048137.html#comment" 26 # goods_id = int(re.findall('\d+', link)[0]) # 裝你要找的商品的商品ID,[6873309,第二個商品ID,第三個商品ID。。。] 100000766433 27 page = 500 # 頁碼最大值,如果評論的頁碼數量大於500則得到的資料會不準確。 28 29 list=[] 30 step = 5 #前i與i-5數量一致的話,程式碼就停止 31 32 for link in link_list: 33 goods_id = int(re.findall('\d+', link)[0]) # 裝你要找的商品的商品ID,[6873309,第二個商品ID,第三個商品ID。。。] 100000766433 34 35 # 括號為商品ID,為了支援翻頁 36 for i in range(page): #i from zero to page 37 url = "https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4640&productId=" + str(goods_id) + "&score=0&sortType=5&page="+str(i)+"&pageSize=10&isShadowSku=0&rid=0&fold=1" 38 list.append(getcontent(url)) 39 if (i>step) and (list[i] == list[i-step]): 40 # print("第",i,"頁停止程式!",goods_id,list[-1]) 41 print("",i,"頁停止程式!",list[-1]) 42 break

四,總結

  json和re還不夠熟練,有待加強。