爬取淘宝商品评论——2020-8月
本文具有時(shí)效性,指不定哪天失效
時(shí)間:2020-8
網(wǎng)頁(yè)分析
一般來(lái)說(shuō),請(qǐng)求的數(shù)據(jù) 會(huì)有幾種可能:
1、很簡(jiǎn)單的html頁(yè)面(靜態(tài)網(wǎng)頁(yè)),就直接requests就可以請(qǐng)求成功;
2、js渲染的頁(yè)面 ,很常見(jiàn),requests請(qǐng)求一堆js數(shù)據(jù);
3、需要登錄才能獲取,登錄后,把cookie 加入請(qǐng)求;
4、json數(shù)據(jù)
顯然淘寶不是靜態(tài)網(wǎng)頁(yè),直接打開(kāi)某個(gè)商品(我們這里選擇Nike旗艦店的一雙鞋),選擇評(píng)論頁(yè)面,按F12進(jìn)入調(diào)試頁(yè)面頁(yè)面,選擇network,然后點(diǎn)擊評(píng)論的下一頁(yè)觀察頁(yè)面請(qǐng)求
放大看一下
顯然評(píng)論數(shù)據(jù)就藏在list_detail開(kāi)頭的響應(yīng)中,那我們就直接看標(biāo)頭(按照慣例,直接復(fù)制標(biāo)題鏈接打開(kāi),并不能得到想要的信息,那就是還需要請(qǐng)求標(biāo)頭的信息):
一般來(lái)說(shuō),這么長(zhǎng)的請(qǐng)求是比較難看的,通常需要多觀察幾頁(yè)
重點(diǎn)在前面那部分,sellerid應(yīng)該是商品id,currentpage是當(dāng)前評(píng)論頁(yè),并且 &ua= 后面那一段長(zhǎng)長(zhǎng)的字符并不相同,或許可以把它去掉,待會(huì)代碼試試。
再看看請(qǐng)求標(biāo)頭需要什么:
authority + path 就是上面的請(qǐng)求url,其他的language,encoding,每個(gè)網(wǎng)頁(yè)基本都一樣的,可加可不加。
我們需要的是cookie(記錄客戶(hù)端的用戶(hù)信息,登錄后會(huì)有),referer(告訴服務(wù)器該網(wǎng)頁(yè)是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的),user-agent(爬蟲(chóng)老朋友了,瀏覽器標(biāo)識(shí))
代碼分析
開(kāi)始寫(xiě)代碼試試
import requestspage = 1 #最終代碼改成for循環(huán)可以遍歷下載path = 'https://rate.tmall.com/list_detail_rate.htm?itemId=612891862405&spuId=1532072041&sellerId=890482188&order=3¤tPage=' url = path + str(page) #原始鏈接加上頁(yè)面headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.59 Safari/537.36 Edg/85.0.564.30',#referer隨便填個(gè)淘寶網(wǎng)頁(yè)應(yīng)該都能用'referer': 'https://detail.tmall.com/item.htm?spm=a230r.1.14.80.675374f6O2Yqxg&id=612891862405&ns=1&abbucket=15','cookie': '復(fù)制你的cookie在這里'} res = requests.get(url,headers = headers)直接打印看看有沒(méi)有獲取成功:
可以看到數(shù)據(jù)是在的里面,雖然看起來(lái)亂七八糟。我們把里面的json提取出來(lái)就好:
用josn加載會(huì)直觀看出鍵值對(duì):
取出需要的屬性(我這里只選擇評(píng)論,商品屬性,時(shí)間):
分析到這里已經(jīng)足夠了,接下來(lái)可以根據(jù)自己需求寫(xiě)代碼:
最終代碼:
import requests import re import json import time import pandas as pddef get_comments():for page in range(1,20):link = 'https://rate.tmall.com/list_detail_rate.htm?itemId=612891862405&spuId=1532072041&sellerId=890482188&order=3¤tPage='url = link + str(page) #原始鏈接加上頁(yè)面數(shù)headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.59 Safari/537.36 Edg/85.0.564.30','referer': 'https://detail.tmall.com/item.htm?spm=a230r.1.14.80.675374f6O2Yqxg&id=612891862405&ns=1&abbucket=15','cookie': '復(fù)制你的cookie到這里'}res = requests.get(url,headers = headers)js_str = re.search('\{.*}',res.text)js_dict = json.loads(js_str.group())time.sleep(7)dict_content = {}rateContent = [] #評(píng)論auctionSku = [] #款式rateDate = [] #時(shí)間for i in range(len(js_dict['rateDetail']['rateList'])):rateContent.append(js_dict['rateDetail']['rateList'][i]['rateContent'])auctionSku.append([js_dict['rateDetail']['rateList'][i]['auctionSku']])rateDate.append([js_dict['rateDetail']['rateList'][i]['rateDate']])dict_content['rateContent'] = rateContentdict_content['auctionSku'] = auctionSkudict_content['rateDate'] = rateDate#dict_content['id'] = '890482188'df = pd.DataFrame(dict_content)if page == 1:df.to_csv('./nike.csv',encoding='utf_8_sig')else:df.to_csv('./nike.csv',mode = 'a',header= False,encoding='utf_8_sig')print('已保存第',page,'頁(yè)','這一頁(yè)有',i,'條評(píng)論')if __name__ == '__main__': get_comments()詞云
補(bǔ)充
這僅僅只是一個(gè)商品的評(píng)論頁(yè)面,能做的事還有很多,比如獲取商品的屬性,價(jià)格,月銷(xiāo)量;遍歷多個(gè)商品,店鋪;對(duì)獲取到的數(shù)據(jù)進(jìn)行數(shù)據(jù)分析;
并且實(shí)際上搜索頁(yè)面的商品數(shù)據(jù)就在網(wǎng)頁(yè)源代碼中:
user_id是商品id,并且在這里可以直觀的獲取價(jià)格,銷(xiāo)量,評(píng)論數(shù)(這對(duì)我們控制上述代碼控制for循環(huán)很有用)
總結(jié)
以上是生活随笔為你收集整理的爬取淘宝商品评论——2020-8月的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(3346):设计模式之工厂模式
- 下一篇: [CF903G]Yet Another