一、前言
有了之前爬取淘寶評論的基礎(chǔ),我想如果換個URL和cookie等參數(shù)是不是一套一個準(zhǔn),然后就跑去京東測試了一下,結(jié)果失敗了!因為頁面編碼不一樣所以爬取淘寶所用的正則化提取評論在京東是實現(xiàn)不了的,這個下面會重點介紹。
京東的反爬比淘寶要低一點,所以在利用requests爬取網(wǎng)頁內(nèi)容也可以不用提供那么多參數(shù),可以自己試一下,我還是按照上次的代碼提供了URL和headers。
二、代碼
因為步驟大部分都一樣,所以具體步驟(參考上次的爬取淘寶)就不細(xì)講,直接說不一樣的地方!
URL根據(jù)具體情況修改,我瀏覽了多頁評論復(fù)制其URL后發(fā)現(xiàn),控制頁面的是page這個參數(shù),所以我在這里斷開!
import pandas as pd
import requests
import time
import json
data_list = []
#爬取的頁數(shù)為2頁,我只是測試能否成功就沒爬太多不然浪費時間!參數(shù)可以自己設(shè)置
for i in range(1,2,1):
print("正在爬取第" + str(i) + "頁")
#構(gòu)建訪問的網(wǎng)址,這個網(wǎng)址可有講究了
first = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100007299145&score=0&sortType=5&page='
last = '&pageSize=10&isShadowSku=0&rid=d3c43db0985ec379&fold=1'
url = first + str(i) + last
#訪問的頭文件,還帶這個cookie
headers ={
# 用的哪個瀏覽器
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
# 從哪個頁面發(fā)出的數(shù)據(jù)申請,每個網(wǎng)站可能略有不同
'referer': 'https://item.jd.com/100007299145.html',
# 哪個用戶想要看數(shù)據(jù),是游客還是注冊用戶,建議使用登錄后的cookie
'cookie':'__jdu=1680001551; areaId=19; ipLoc-djd=19-1611-19916-0; PCSYCityID=CN_440000_440500_440507; shshshfpb=13d5ace3e0c654e309b2d61e7a07b91fad6982624770bea5f5bb38092c; shshshfpa=4c737b08-3394-a4b3-b659-a18b192fc770-1595515041; jwotest_product=99; pinId=2p6SoycXA0ub7BEMVGWTH7V9-x-f3wj7; pin=jd_74d219351fbde; unick=jd_74d219351fbde; _tp=8GzPfmiGUEaBRGeogBvd4t5TplVxg3zxt8bs3ngcPNY%3D; _pst=jd_74d219351fbde; unpl=V2_ZzNtbUoHQxRzWkQGK0oMAWIFEA5LUEcVfQtAVXpLXAI3C0ANclRCFnQUR1JnGlkUZwQZWEJcQxFFCEdkeBBVAWMDE1VGZxBFLV0CFSNGF1wjU00zQwBBQHcJFF0uSgwDYgcaDhFTQEJ2XBVQL0oMDDdRFAhyZ0AVRQhHZHseVQRmAhJZRldzJXI4dmR8HloGYQQiXHJWc1chVEFVfRtUBSoDFVRDVkIVcQxGZHopXw%3d%3d; TrackID=1wCKdOSD5KrPr8O-8Q8ZNY2qHWWnSFYqFttYCGaghAhCTJfuMXSq-ceKeblveKgrTAtrGxtwa_UKBfYrvn7gjh9rzj-yW_CTZ10IImNCXnDk; thor=009B9D6507BE905BC2DE807BBE72F8B35CD8B73035C26D7A345038B5814CE35B14B95EF514394E6B4FC7B2D50681F82230750F0A77F1DD2C0FDCF18CBE482BE34C35E09F82869EDAEBC523FC3D06AFB9697DD5D757371816CBB38D73638844425A74040FFF3C912B55C1D4F7D7C74B3349C0CB29CA3C28362C3448D41C3FD945FBFA4516199E07C7248688A0AACF46972E0F68ECB17F077A59B635B886B42CFF; ceshi3.com=000; __jdc=122270672; 3AB9D23F7A4B3C9B=AIA2RCPMDF6FLUI63SVRKBPBVA7Y6UOERHJAVC6EH35NTNAVXLPFLY237UYHURSTRA5M2DVSUDOYMUQQSLIRCJ3K6E; shshshfp=614a80530aada68a60a3c02ca77022d6; __jdv=122270672|shouji.jd.com|t_0_|zssc|ac8146d4-d7c0-4654-9cdc-bf07a57877eb-p_128538|1595580177176; __jda=122270672.1680001551.1595515038.1595580074.1595580177.4; shshshsID=bee374abb93f13738426527a23aedafa_5_1595580185627; __jdb=122270672.2.1680001551|4.1595580177; JSESSIONID=5B8E5551DA8CE1D3DE4E93C1C47F32E1.s1'
}
#嘗試獲取數(shù)據(jù)(這里的數(shù)據(jù)應(yīng)該是從json里面獲取的)
try:
data = requests.get(url,headers = headers).text
time.sleep(10)
#print(data)
'''
result = re.findall('"content":"(.*?)","creationTime"',data)
data_list.extend(result)
'''
#將Str數(shù)據(jù)改為字典,必須去掉最開頭和最結(jié)尾后面對應(yīng)的符號才可以轉(zhuǎn)化為字典!
jd=json.loads(data.lstrip('fetchJSON_comment98(').rstrip(');'))
#print(jd)
#取出用戶評論,但是還包含了用戶ID等其他信息和奇怪的符號
com_list=jd['comments']
#print(com_list)
#爬取的數(shù)據(jù)為字典,將評論按鍵值對取出
for a in com_list:
result=a['content']
#extend逐個添加,這里無論是字符串或者字典,利用extend都會變成一個字一個
#字的樣子,所以要將整句話作為一個整體添加進(jìn)去!
data_list.append(result)
#print(data_list)
except:
print("本頁爬取失敗")
df = pd.DataFrame()
df["評論"] = data_list
df.to_excel("評論_匯總1.xlsx")
代碼大體是沒變的,里面也都有注釋,主要講一下評論的提取,上次的淘寶是利用正則化來提取,因為將爬取的數(shù)據(jù)data輸出(print)后我們很容易找到規(guī)律,評論存在于兩個詞之間。在爬取京東的商品評論時,我想著是不是只要找到規(guī)律依葫蘆畫瓢就可以無限套娃了(秒??!)然后print一看

我發(fā)現(xiàn)評論主要在content和vcontent之間,馬上復(fù)制黏貼按照正則化項一輸出,多了好多奇奇怪怪的字符評論也少了幾條,重新回去仔細(xì)觀察后發(fā)現(xiàn)在content和vcontent之間的語句不止評論,還包括客服回復(fù)等其他東西,而且最重要的是有一些評論不是在這兩個詞之間!
然后我各種觀察,修改正則項通通失敗了!最后去網(wǎng)上看大佬們是怎么處理的,看完理解后就得到上面的結(jié)果了,下面說一下思路!
首先將爬取的評論用json.loads()轉(zhuǎn)化為字典,當(dāng)然也不是那么容易轉(zhuǎn)換的,不然上面的代碼怎么會有括號里面的那串東西!
我理解好思路后就想轉(zhuǎn)化為字典就好,那不是不用括號內(nèi)那串代碼,果斷去掉,一運行,爬取失??!好吧!果然沒有一條代碼是多余的。
括號里面的代碼是去除data(即爬取到的內(nèi)容)中的最前面和最后面相應(yīng)的字符串,如果仔細(xì)觀察print出來data就可以發(fā)現(xiàn)(截圖并不是完整的data)
image.png
除了開頭和結(jié)果的符號外,這個看起來就像極了字典的格式,所以只要把開始和結(jié)果的多余字符串去除后,就可以轉(zhuǎn)化為字典了!
轉(zhuǎn)化完成后,print輸出會發(fā)現(xiàn)內(nèi)容簡潔了一些,仔細(xì)觀察會發(fā)現(xiàn)評論都在comments后面,所以我們將其單獨取出,再一次print,可以發(fā)現(xiàn)內(nèi)容更為簡潔了,離成功也不遠(yuǎn)了!繼續(xù)觀察,可以發(fā)現(xiàn)整體是一個字典,評論都是在content中,準(zhǔn)確來說content是一個鍵,而評論是它的值,我們要的就是這個東西,循環(huán)輸出就好了!
這里用append來添加是因為如果用extend全部都變成一個字一個字,可以看一下這兩個方法的區(qū)別!
【注:上面超鏈接為方法的詳細(xì)解釋】
參考文章:https://www.jb51.net/article/140151.htm
https://www.cnblogs.com/huangbiquan/p/7923008.html
http://www.itdecent.cn/p/d4bbb6267e59
https://www.cnblogs.com/mayite/articles/9131501.html
