一杨赤、前言
有了之前爬取淘寶評論的基礎,我想如果換個URL和cookie等參數(shù)是不是一套一個準,然后就跑去京東測試了一下风皿,結果失敗了!因為頁面編碼不一樣所以爬取淘寶所用的正則化提取評論在京東是實現(xiàn)不了的匠璧,這個下面會重點介紹桐款。
京東的反爬比淘寶要低一點,所以在利用requests爬取網頁內容也可以不用提供那么多參數(shù)夷恍,可以自己試一下魔眨,我還是按照上次的代碼提供了URL和headers。
二酿雪、代碼
因為步驟大部分都一樣遏暴,所以具體步驟(參考上次的爬取淘寶)就不細講,直接說不一樣的地方指黎!
URL根據(jù)具體情況修改拓挥,我瀏覽了多頁評論復制其URL后發(fā)現(xiàn),控制頁面的是page這個參數(shù)袋励,所以我在這里斷開侥啤!
import pandas as pd
import requests
import time
import json
data_list = []
#爬取的頁數(shù)為2頁,我只是測試能否成功就沒爬太多不然浪費時間茬故!參數(shù)可以自己設置
for i in range(1,2,1):
print("正在爬取第" + str(i) + "頁")
#構建訪問的網址盖灸,這個網址可有講究了
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ù)申請磺芭,每個網站可能略有不同
'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ù)應該是從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ù)改為字典,必須去掉最開頭和最結尾后面對應的符號才可以轉化為字典!
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都會變成一個字一個
#字的樣子己英,所以要將整句話作為一個整體添加進去!
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ā)現(xiàn)在content和vcontent之間的語句不止評論叠国,還包括客服回復等其他東西,而且最重要的是有一些評論不是在這兩個詞之間戴尸!
然后我各種觀察粟焊,修改正則項通通失敗了!最后去網上看大佬們是怎么處理的孙蒙,看完理解后就得到上面的結果了项棠,下面說一下思路!
首先將爬取的評論用json.loads()轉化為字典挎峦,當然也不是那么容易轉換的香追,不然上面的代碼怎么會有括號里面的那串東西!
我理解好思路后就想轉化為字典就好坦胶,那不是不用括號內那串代碼透典,果斷去掉,一運行顿苇,爬取失斍椭洹!好吧纪岁!果然沒有一條代碼是多余的凑队。
括號里面的代碼是去除data(即爬取到的內容)中的最前面和最后面相應的字符串,如果仔細觀察print出來data就可以發(fā)現(xiàn)(截圖并不是完整的data)
image.png
除了開頭和結果的符號外幔翰,這個看起來就像極了字典的格式漩氨,所以只要把開始和結果的多余字符串去除后西壮,就可以轉化為字典了!
轉化完成后叫惊,print輸出會發(fā)現(xiàn)內容簡潔了一些款青,仔細觀察會發(fā)現(xiàn)評論都在comments后面,所以我們將其單獨取出赋访,再一次print可都,可以發(fā)現(xiàn)內容更為簡潔了,離成功也不遠了蚓耽!繼續(xù)觀察渠牲,可以發(fā)現(xiàn)整體是一個字典,評論都是在content中步悠,準確來說content是一個鍵签杈,而評論是它的值,我們要的就是這個東西鼎兽,循環(huán)輸出就好了答姥!
這里用append來添加是因為如果用extend全部都變成一個字一個字,可以看一下這兩個方法的區(qū)別谚咬!
【注:上面超鏈接為方法的詳細解釋】
參考文章:https://www.jb51.net/article/140151.htm
https://www.cnblogs.com/huangbiquan/p/7923008.html
http://www.reibang.com/p/d4bbb6267e59
https://www.cnblogs.com/mayite/articles/9131501.html