爬取京東網頁評論(動態網頁)


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))

 


免責聲明!

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



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