京東商城的頁面不是靜態頁面,其評論信息存放於json文件中,由ajax控制,所以我們在瀏覽器上看到的網頁源代碼和用Python爬下來的是不一樣的,所以我們真正要爬取的是評論數據所存放的json文件。
首先打開一個京東商品的評論頁面,按F12。然後點擊network之後再刷新一次頁面,會顯示如下信息。
在所有的json文件中找到那個存放評論的文件:
觀察其URL,其中有一個參數是page=0,大概這個參數表示第幾頁評論,那麼我們就可以通過修改page參數來獲取其他所有頁的評論,分析完之後開始編寫程序。
首先創造Request對象,然後使用urlopen函數將該文件爬取下來,通過Python中的json庫來解析改文件,最後保存到文件中。代碼如下:
import urllib.request
import json
import time
import xlwt
#======》爬取評論信息《=======#
end_page = int(input('請輸入爬取的結束頁碼:'))
for i in range(0,end_page+1):
print('第%s頁開始爬取------'%(i+1))
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100004770259&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&fold=1 '
url = url.format(i)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Referer': 'https://item.jd.com/100004770259.html'
}
request = urllib.request.Request(url=url,headers=headers)
content = urllib.request.urlopen(request).read().decode('gbk')
content = content.strip('fetchJSON_comment98vv385();')
obj = json.loads(content)
comments = obj['comments']
fp = open('京東.txt','a',encoding='utf8')
for comment in comments:
#評論時間
creationTime = comment['creationTime']
#評論人
nickname = comment['nickname']
#評論內容
contents = comment['content']
item = {
'評論時間': creationTime,
'用戶': nickname,
'評論內容': contents,
}
string = str(item)
fp.write(string + '\n')
print('第%s頁完成----------'%(i+1))
time.sleep(4)
fp.close()
更新
這個程序比較低效,在新的博客中我實現了一個功能更加強大的程序:Python爬取京東商品評論(二)、Python爬取京東商品評論(三)