爬取京东网页评论(动态网页)
1.當(dāng)網(wǎng)頁打開的方式不同時,在開發(fā)者選項(xiàng)找到的包含評論的文件地址不同,比如第一種,當(dāng)我們找到的評論界面是含有下一頁選項(xiàng)的時候(如下圖)。我們在左邊文件界面發(fā)現(xiàn)包含評論的網(wǎng)頁地址名字為‘'productPageComments.action'開頭的,點(diǎn)開查看header和response可以分析得網(wǎng)址的規(guī)律,Query string? parameters 里面的page對應(yīng)著評論的頁面,改變這個參數(shù)就可以實(shí)現(xiàn)評論網(wǎng)頁的翻頁了。
對于網(wǎng)頁的內(nèi)容點(diǎn)開response可以看見是json格式的網(wǎng)頁,所以復(fù)制下來可以用在線的json在線解析工具解析一下,看清楚網(wǎng)站的結(jié)構(gòu)。我隨便找了個json解析的網(wǎng)站,分析了一下這個網(wǎng)頁的結(jié)構(gòu)。
2.當(dāng)評論網(wǎng)頁是以另外一種方式打開,如下圖,打開后網(wǎng)頁可以一直往下拖自動加載評論,不需要點(diǎn)擊下一頁(也不包含下一頁選項(xiàng))。這時我們在左邊的文件選項(xiàng)中找到包含評論的網(wǎng)頁地址名字為‘'getcommentlist'開頭的,其他的內(nèi)容和上面一樣,找到url的規(guī)律,再到網(wǎng)站里用爬蟲規(guī)則來提取需要的信息。
3.小技巧,當(dāng)打開開發(fā)者選項(xiàng)時,在network里面文件特別多,找到想要的文件比較困難,可以按住'ctrl +shift+F',調(diào)出search選項(xiàng),鍵入關(guān)鍵詞,在打開的文件中查找包含關(guān)鍵詞的文件。如下圖,查找包含‘評論’的文件
4.因?yàn)檫@些動態(tài)網(wǎng)頁通常都是腳本(json,xml)可以點(diǎn)擊'Type'選項(xiàng)對文件進(jìn)行自動歸類,在script類型中找相應(yīng)的評論文件,這樣可以接更清晰,一目了然,如下圖
?5.爬取的代碼
整體爬取的思路,首先,確定爬去的網(wǎng)頁是否是動態(tài)網(wǎng)頁,如果直接對爬取網(wǎng)頁打開源代碼可以看見所有的需要的信息,并且可以直接獲得每一頁的網(wǎng)頁的url,那么靜態(tài)網(wǎng)頁就不需要上面的那些操作了,直接看源代碼用寫爬蟲了。如果針對某一產(chǎn)品打開不同網(wǎng)頁的評論頁面但是url地址都不變,說明隱藏了url的其他部分,鑒定為動態(tài)網(wǎng)頁,運(yùn)用上面的方法打開開發(fā)者選項(xiàng),找到對應(yīng)的爬去的網(wǎng)頁的文件,獲取url參數(shù),找到地址變動的規(guī)律,一般都是頁面page的變動。找到url地址就好辦了,找到某一個爬取頁面,分析頁面結(jié)構(gòu),用requests,BeautifulSoup,re等抽取需要的信息。下面是爬取京東小米手機(jī)的代碼,因?yàn)榫W(wǎng)站反扒,所以限定了爬去的時間,不然爬太快會報錯。關(guān)于json之前不太明白,查了一下后就是網(wǎng)頁用字典形式來變現(xiàn)出來,網(wǎng)頁結(jié)構(gòu)清晰,易于處理。這里爬的網(wǎng)頁就是json格式。
1 from bs4 import BeautifulSoup 2 import requests 3 import re,json 4 import pandas as pd 5 import time 6 7 #京東小米官方網(wǎng)站爬取小米6X的評論 8 #動態(tài)網(wǎng)頁爬取 9 10 def getHtml(url,data): #只輸入URL的主體部分,后面的參數(shù)用下面的字典附加上 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) # 將頁面內(nèi)容編碼成json數(shù)據(jù),(無論什么格式的數(shù)據(jù)編碼后都變成了字符串類型str) 22 j = json.loads(i) # 解碼,將json數(shù)據(jù)解碼為Python對象 23 # print(type(j)) 24 comment = re.findall(r'{"productAttr":.*}', j) # 對網(wǎng)頁內(nèi)容篩選找到我們想要的數(shù)據(jù),得到值為字典的字符串即'{a:1,b:2}' 25 #print(comment) 26 comm_dict = json.loads(comment[0]) # 將json對象obj解碼為對應(yīng)的字典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主體和爬取網(wǎng)頁的數(shù)量 39 data = {'callback': 'fetchJSON_comment98vv6708', # 調(diào)整頁數(shù)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:#防止網(wǎng)頁提取失敗,使爬取終斷,直接跳過失敗頁,繼續(xù)爬取 52 data['page']=i 53 html = getHtml(url, data) 54 comment = getComment(html) 55 except: 56 continue 57 comments+=comment 58 print('頁數(shù)',i) 59 time.sleep(3)#由于網(wǎng)站反爬蟲,所以每爬一頁停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))?
轉(zhuǎn)載于:https://www.cnblogs.com/zz22--/p/9320614.html
總結(jié)
以上是生活随笔為你收集整理的爬取京东网页评论(动态网页)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三篇:函数之对象
- 下一篇: 认证模式之Basic模式