1.當網頁打開的方式不同時,在開發者選項找到的包含評論的文件地址不同,比如第一種,當我們找到的評論界面是含有下一頁選項的時候(如下圖)。我們在左邊文件界面發現包含評論的網頁地址名字為‘'productPageComments.action'開頭的,點開查看header和response可以分析得網址的規律,Query string parameters 里面的page對應着評論的頁面,改變這個參數就可以實現評論網頁的翻頁了。


對於網頁的內容點開response可以看見是json格式的網頁,所以復制下來可以用在線的json在線解析工具解析一下,看清楚網站的結構。我隨便找了個json解析的網站,分析了一下這個網頁的結構。
2.當評論網頁是以另外一種方式打開,如下圖,打開后網頁可以一直往下拖自動加載評論,不需要點擊下一頁(也不包含下一頁選項)。這時我們在左邊的文件選項中找到包含評論的網頁地址名字為‘'getcommentlist'開頭的,其他的內容和上面一樣,找到url的規律,再到網站里用爬蟲規則來提取需要的信息。

3.小技巧,當打開開發者選項時,在network里面文件特別多,找到想要的文件比較困難,可以按住'ctrl +shift+F',調出search選項,鍵入關鍵詞,在打開的文件中查找包含關鍵詞的文件。如下圖,查找包含‘評論’的文件

4.因為這些動態網頁通常都是腳本(json,xml)可以點擊'Type'選項對文件進行自動歸類,在script類型中找相應的評論文件,這樣可以接更清晰,一目了然,如下圖

5.爬取的代碼
整體爬取的思路,首先,確定爬去的網頁是否是動態網頁,如果直接對爬取網頁打開源代碼可以看見所有的需要的信息,並且可以直接獲得每一頁的網頁的url,那么靜態網頁就不需要上面的那些操作了,直接看源代碼用寫爬蟲了。如果針對某一產品打開不同網頁的評論頁面但是url地址都不變,說明隱藏了url的其他部分,鑒定為動態網頁,運用上面的方法打開開發者選項,找到對應的爬去的網頁的文件,獲取url參數,找到地址變動的規律,一般都是頁面page的變動。找到url地址就好辦了,找到某一個爬取頁面,分析頁面結構,用requests,BeautifulSoup,re等抽取需要的信息。下面是爬取京東小米手機的代碼,因為網站反扒,所以限定了爬去的時間,不然爬太快會報錯。關於json之前不太明白,查了一下后就是網頁用字典形式來變現出來,網頁結構清晰,易於處理。這里爬的網頁就是json格式。
1 from bs4 import BeautifulSoup 2 import requests 3 import re,json 4 import pandas as pd 5 import time 6 7 #京東小米官方網站爬取小米6X的評論 8 #動態網頁爬取 9 10 def getHtml(url,data): #只輸入URL的主體部分,后面的參數用下面的字典附加上 11 try: 12 r=requests.get(url,params=data) 13 r.raise_for_status() 14 r.encoding=r.apparent_encoding 15 return r.text 16 except: 17 print('爬取失敗') 18 19 def getComment(html):#獲得一頁的評論 20 commentList=[] 21 i = json.dumps(html) # 將頁面內容編碼成json數據,(無論什么格式的數據編碼后都變成了字符串類型str) 22 j = json.loads(i) # 解碼,將json數據解碼為Python對象 23 # print(type(j)) 24 comment = re.findall(r'{"productAttr":.*}', j) # 對網頁內容篩選找到我們想要的數據,得到值為字典的字符串即'{a:1,b:2}' 25 #print(comment) 26 comm_dict = json.loads(comment[0]) # 將json對象obj解碼為對應的字典dict 27 # print(type(comm_dict)) 28 commentSummary = comm_dict['comments'] # 得到包含評論的字典組成的列表 29 for comment in commentSummary: # 遍歷每個包含評論的字典,獲得評論和打分 30 c_content = ''.join(comment['content'].split()) # 獲得評論,由於有的評論有換行,這里用split()去空格,換行,並用join()連接起來形成一整段評論,便於存儲 31 score = comment['score'] # 用戶打分 32 # print(score) 33 # print(c_content) 34 commentList.append([score,c_content]) 35 return commentList 36 37 '''獲得多頁評論''' 38 def conments(url,num):#url主體和爬取網頁的數量 39 data = {'callback': 'fetchJSON_comment98vv6708', # 調整頁數page 40 'productId': '7437756', 41 'score': 0, 42 'sortType': 5, 43 'page': 0, 44 'pageSize': 10, 45 'isShadowSku': 0, 46 'rid': 0, 47 'fold': 1 48 } 49 comments=[] 50 for i in range(num+1): 51 try:#防止網頁提取失敗,使爬取終斷,直接跳過失敗頁,繼續爬取 52 data['page']=i 53 html = getHtml(url, data) 54 comment = getComment(html) 55 except: 56 continue 57 comments+=comment 58 print('頁數',i) 59 time.sleep(3)#由於網站反爬蟲,所以每爬一頁停3秒 60 # if i/20==0: 61 # time.sleep(5) 62 return comments 63 64 if __name__ =='__main__': 65 time_start = time.time() 66 url = 'https://sclub.jd.com/comment/productPageComments.action?' 67 comm=conments(url,500) 68 print('共計%d條評論'%(len(comm)))#打印出總共多少條評論 69 name=['score','comment'] 70 file=pd.DataFrame(columns=name,data=comm) 71 file.to_csv('D:/machinelearning data/crawlerData/mi6x_JD500.csv',index=False) 72 time_end = time.time() 73 print('耗時%s秒' % (time_end - time_start))
