爬取京東評論信息


一,爬蟲需求分析

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還不夠熟練,有待加強。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM