用Python爬取京東手機評論
內容非原創,屬于對視頻和博客內容的學習筆記,后續會更新多執行緒爬取和根據爬取評論進行的情感分析,
1、所使用的瀏覽器為火狐瀏覽器
先隨意點開一個手機商品
https://item.jd.com/100006788665.html
以華為手機為例,點進去后F12打開開發者工具,找到all,在過濾框內輸入comment,找到productpagecomment.action
剛點進去還有許多資訊加載不出來,需要多點幾下其他地方,比如評論之類的,

全部評論:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
好評:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=3&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
中評:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=2&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
差評:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=1&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
帶圖評論:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=4&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
追評:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=5&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
帶視頻評論:
https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006788665&score=7&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
可以看到這個url里都有以下幾個引數:
callback=fetchJSON_comment98
應該是json檔案的地址
productId=100007299121
產品id和網頁中https://item.jd.com/100007299121.html的id是一樣的
score=0
這里的score是評價的型別,0代表全部評論,差評是1,中評是2,好評是3,帶圖評論是4,追評是5,帶視頻評論是7,(6不知道去哪里了)
sortType=5
評論排序的類別,推薦排序是5,時間排序是6
page=0
評論的頁數,第一頁為0
pageSize=10
每一頁的評論數

這里是評論的總結性資訊:
{
“productCommentSummary”: {
“skuId”: 100006788665,
“averageScore”: 5,
“defaultGoodCount”: 685844,
“defaultGoodCountStr”: “68萬+”,
“commentCount”: 863015,
“commentCountStr”: “86萬+”,
“goodCount”: 172223,
“goodCountStr”: “17萬+”,
"videoCount": 2638,
"videoCountStr": "2600+",
"afterCount": 4852,
"afterCountStr": "4800+",
"showCount": 24200,
"showCountStr": "2.4萬+",
"productId": 100006788665,
"score1Count": 2600,
"score2Count": 592,
"score3Count": 1756,
"score4Count": 3499,
"score5Count": 168724
}
}
知道這幾個引數的意思之后就可以根據自己想要的內容進行爬取,這里我選擇爬取全部評論的前100頁,因此只需要對page進行回圈,score=0即可,
import requests
import pandas as pd
import json
import time
import csv
import re
#https://club.jd.com/comment/productPageComments.action?
#callback=fetchJSON_comment98&productId=100006788665
#&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
#requests請求地址
url = "https://club.jd.com/comment/productPageComments.action?"
#請求頭
header = {"User-Agent";"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.63 Safari/537.36"}
#多頁評論
for i in range(100):
#請求引數
data = {"callback":"fetchJSON_comment98",
"productId":100006788665,
"score":0,
"sortType":5,
"page":i,
"pageSize":10,
"isShadowSku":0,
"fold":1,
}
html = requests.get(url,params = data,headers = header)
這里有一點忘記說了,京東手機不通的產品有不同的productid,想要換不同的產品進行爬取,只需要換這個id就行了,
在用get請求網頁內容時,有以下兩種方式:
1、requests.get(url = “”)
url=https://club.jd.com/comment/productPageComments.action?
callback=fetchJSON_comment98&productId=100006788665
&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
2、requests.get(url = “”, params = data) 使用Params
url=https://club.jd.com/comment/productPageComments.action?
html_json = re.search("(?<=fetchJSON_comment98\().*(?=\))",html.text).group(0)
#(?<=fetchJSON_comment98().(?=)
(?<=fetchJSON_comment98()表示匹配以"fetchJSON_comment98(“為開頭的字串,并且捕獲(存盤)到分組中,
這里的(以(表示,許多元字符要求在試圖匹配它們時特別對待,若要匹配這些特殊字符,必須首先使字符"轉義”,
即,將反斜杠字符\ 放在它們前面,
(?=)表示匹配以\結尾的字串,并且捕獲(存盤)到分組中,
中間的.,其中.表示匹配除換行符 \n 之外的任何單字符,*表示匹配前面的子運算式零次或多次,兩個加起來形成一個貪婪匹配,就是除了換行符之外,所有字符都匹配,并且匹配次數不限制,
#import re
a = “123abc456”
print re.search("([0-9])([a-z])([0-9])",a).group(0) #123abc456,回傳整體
print re.search("([0-9])([a-z])([0-9])",a).group(1) #123
print re.search("([0-9])([a-z])([0-9])",a).group(2) #abc
print re.search("([0-9])([a-z])([0-9])",a).group(3) #456
正則運算式中的三組括號把匹配結果分成三組
group() 同group(0)就是匹配正則運算式整體結果
group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分,
沒有匹配成功的,re.search()回傳None
‘’’
j = json.load(html_json)
#存盤為字典
for jj in range(len(j["comments"])):
data1 = [(j["comments"][jj]["content"])]
#從j中找出"comments"中的"conent"
data2 = pd.DataFrame(data1)
data2.to_csv("C:/Users/01/Desktop/京東評論.csv",header = False,index = False,mode = "a+")
time.sleep(2)
print("page "+str(1+i)+"has done")
借鑒資料:
如何解決python爬蟲中Response [200]回傳值問題
正則 ?<= 和 ?= 用法
Python3 re.search()方法
Python——re.search().group()
Request–get請求的用法
源代碼學習視頻
完整代碼:
import requests
import pandas as pd
import json
import time
import csv
import re
url = "https://club.jd.com/comment/productPageComments.action?"
#請求頭
header = {"User-Agent";"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.63 Safari/537.36"}
#多頁評論
for i in range(100):
#請求引數
data = {"callback":"fetchJSON_comment98",
"productId":100006788665,
"score":0,
"sortType":5,
"page":i,
"pageSize":10,
"isShadowSku":0,
"fold":1,
}
html = requests.get(url,params = data,headers = header)
html_json = re.search("(?<=fetchJSON_comment98\().*(?=\))",html.text).group(0)
j = json.load(html_json)
#存盤為字典
for jj in range(len(j["comments"])):
data1 = [(j["comments"][jj]["content"])]
#從j中找出"comments"中的"conent"
data2 = pd.DataFrame(data1)
data2.to_csv("C:/Users/01/Desktop/京東評論.csv",header = False,index = False,mode = "a+")
time.sleep(2)
print("page "+str(1+i)+"has done")
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/237657.html
標籤:python
