一、前言
淘寶的反爬比較嚴(yán)格掘托,且淘寶協(xié)議好像不允許爬取它的評(píng)論,我查了一下好像也不建議直接用自己的淘寶號(hào)去爬燃凇(好像有封號(hào)風(fēng)險(xiǎn))闪盔,我在測(cè)試的時(shí)候弯院,可能是太頻繁了淘寶賬號(hào)被強(qiáng)制退了并提醒了用戶協(xié)議。話不多說(shuō)泪掀,我們直接來(lái)看一下思路和代碼听绳。
二、實(shí)例
1异赫、思路
因?yàn)樘詫毞磁辣容^嚴(yán)重椅挣,所以該代碼需要登錄淘寶賬號(hào)模仿人為瀏覽復(fù)制評(píng)論,且需要提供較為詳細(xì)的URL塔拳,還要提供cookie等鼠证。
2、過(guò)程
明確自己所要找的商品評(píng)論靠抑,進(jìn)入相應(yīng)的商品中量九,我以小米手機(jī)為例。
我這里進(jìn)入了小米旗艦店的米10的評(píng)論區(qū)中颂碧。
這個(gè)時(shí)候荠列,打開開發(fā)者模式(按f12)
第一步點(diǎn)擊圖中的放大鏡,如果4中的搜索框有內(nèi)容载城,則按一下步驟2的那個(gè)禁止符號(hào)清除搜索框中的內(nèi)容肌似,要是原本就沒(méi)有內(nèi)容就跳過(guò)第二步直接點(diǎn)擊3中的具體評(píng)論。
注:這里一定要先進(jìn)入開發(fā)者模式再去點(diǎn)擊評(píng)論个曙,如果是先點(diǎn)擊具體評(píng)論在打開開發(fā)者模式復(fù)制黏貼锈嫩,會(huì)搜索不到內(nèi)容的,也就找不到對(duì)應(yīng)的URL等參數(shù)了?寻帷:舸纭!
選擇一條評(píng)論復(fù)制猴贰,然后黏貼到4中的搜索框去对雪,點(diǎn)一下5,或者按一下回車鍵米绕,出現(xiàn)以下內(nèi)容瑟捣。
點(diǎn)擊畫紅線的地方。
出現(xiàn)上面的頁(yè)面點(diǎn)到headers去
這里我們看到了頁(yè)面的URL栅干,我們往下拉還可以看見(jiàn)cookie迈套,referer,user-agent碱鳞,要將這四個(gè)找出來(lái)分別黏貼在下面的代碼中桑李。注意上圖畫紅線的地方,在下面會(huì)進(jìn)行特別的說(shuō)明。
3贵白、代碼
import pandas as pd
import requests
import re
import time
data_list = []
#爬取的頁(yè)數(shù)為1到19頁(yè)
for i in range(1,20,1):
print("正在爬取第" + str(i) + "頁(yè)")
#構(gòu)建訪問(wèn)的網(wǎng)址率拒,這個(gè)網(wǎng)址可有講究了
first = 'https://rate.tmall.com/list_detail_rate.htm?itemId=611224893062&spuId=1526565904&sellerId=1714128138&order=3¤tPage='
last = '&append=0&content=1&tagId=20101023&posi=1&picture=0&groupId=&ua=098%23E1hvwQvbvPhvUvCkvvvvvjiPnL5ptjEvnLqU1jljPmP9tjtPPLsp1jnmnLs9QjnhRphvChCvvvmCvpviflKcvCqw7Di4cMc5MPC46HdPzg9umWTMsd%2BL4OU2yqeWkeHXvK8WFfKjvpvhphhvv8wCvvBvpvpZRphvChCvvvvPvpvhvv2MMQhCvvXvovvvvvvEvpCWpGZjv8WpwHQDNr3l5dUfb161D764d5lPwymQD40wjovfBdmxdX3Qbc6OfakKDzEjaDuxfXkOjoCABYoO%2Bul1pB61D70Oe169PDrr1UyCvvXmp99he1AivpvUphvhsf0xXDTtvpvIphvvvvvvphCvpCphvvCvIyCvjvUvvhBGphvwv9vvBhEvpCQmvvChp9%3D%3D&itemPropertyId=&itemPropertyIndex=&userPropertyId=&userPropertyIndex=&rateQuery=&location=&needFold=0&_ksTS=1595499293797_3730&callback=jsonp3731'
url = first + str(i) + last
#訪問(wèn)的頭文件,還帶這個(gè)cookie
headers ={
# 用的哪個(gè)瀏覽器
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
# 從哪個(gè)頁(yè)面發(fā)出的數(shù)據(jù)申請(qǐng)禁荒,每個(gè)網(wǎng)站可能略有不同
'referer': 'https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w15914064-15567552165.16.55e448feb3oh69&id=611224893062&scene=taobao_shop&sku_properties=10004:7169121965;5919063:6536025;12304035:946237073',
# 哪個(gè)用戶想要看數(shù)據(jù)猬膨,是游客還是注冊(cè)用戶,建議使用登錄后的cookie
'cookie':'cna=4WV4F30//QACAXjl/xer2+AZ; _m_h5_tk=a79ba70f915d9ba3ac924993f793e2d9_1595438320858; _m_h5_tk_enc=dcaba3d7058acdf78f1333d3c2d09fb7; sm4=440500; lid=yzfzf8342; enc=GtTHaCYoIyS1Mrx%2FljjVSyXnBQUpSdD49%2BI27a1U08Cm%2FHNNeNt82Sa7RZnWqxEUozAuCF19ISBHDVpQK%2Frgvw%3D%3D; sgcookie=ExKWIC%2FrOlfUjMlWR8Gz1; t=f3bcc8d7f1f91e3e0f43a493d3fedaf5; uc3=lg2=UIHiLt3xD8xYTw%3D%3D&vt3=F8dBxGyhBGoK%2F%2BpK6CI%3D&nk2=GhEd8Ku88aZW&id2=UNQ2me8UbNu12g%3D%3D; tracknick=yzfzf8342; uc4=nk4=0%40GJ2QH2OyEy7usffj2261IhUpjU0%3D&id4=0%40UgP9omVfbD01hXa5NKpMgzuMLbj7; lgc=yzfzf8342; _tb_token_=3417a870bd554; cookie2=15bebf99545ebefea6966d68d22d9fa0; l=eBSgfFqlONScLUA8BO5alurza77tUFOXDVVzaNbMiIncC6bFh8pXgb-QK7-e2QtRR8XcGJSw4kkZIset6er4JyMfoTB7K9cdvdH2Cef..; isg=BKmpm2Ac0sEUB-509iyZubs6uFUDdp2oFB45U0uDcgGUEvkkxMdaeBNE1LYktzXg'
}
#嘗試獲取數(shù)據(jù)(這里的數(shù)據(jù)應(yīng)該是從json里面獲取的)
try:
data = requests.get(url,headers = headers).text
time.sleep(10)#設(shè)置睡眠時(shí)間,模擬人的瀏覽
result = re.findall('rateContent":"(.*?)"fromMall"',data)
data_list.extend(result)
except:
print("本頁(yè)爬取失敗")
df = pd.DataFrame()
df["評(píng)論"] = data_list
df.to_excel("評(píng)論_匯總1.xlsx")
cookie呛伴,referer勃痴,user-agent這三個(gè)直接找到復(fù)制黏貼就好了,但是URL我們需要分為兩部分磷蜀,分隔的地方就在上面圖中畫紅線處召耘。將其分為first和last黏貼進(jìn)去。
為什么要這這里分隔呢褐隆?
我們要明白污它,我們爬取的是多頁(yè)評(píng)論,而在淘寶中評(píng)論頁(yè)面是局部頁(yè)面庶弃,currentPage這個(gè)參數(shù)指的是當(dāng)前頁(yè)衫贬,我們可以看見(jiàn)上面截圖中它的值為1,因?yàn)槲以诘谝豁?yè)評(píng)論中歇攻,可以注意到代碼中在first后面的”currentPage=”沒(méi)有具體的值固惯,它的值在下面代碼url = first + str(i) + last,我用str(i)賦值了缴守。
【注:上面用到了requests庫(kù)來(lái)獲取頁(yè)面信息葬毫,requests庫(kù)的使用可以參考這篇文章。還利用了正則化表達(dá)式來(lái)提取評(píng)論屡穗,大家如果將爬取的最初始結(jié)果data輸出會(huì)看到一堆亂七八糟的符號(hào)文字等贴捡,仔細(xì)看會(huì)發(fā)現(xiàn)評(píng)論都是在"rateContent"和"fromMall"之間,所以用正則表達(dá)式將評(píng)論從爬取的內(nèi)容中提取出來(lái)村砂±谜】
最后得到的結(jié)果如下圖:
三、制作詞云
詞云的制作础废,比較簡(jiǎn)單汛骂,一些解釋我已經(jīng)備注在代碼中了,所以直接看代碼就好评腺。
import jieba
import pandas as pd
from wordcloud import WordCloud
#讀取文件帘瞭,如果是xlsx則用utf-8編碼,若是CSV文件則用gbk編碼
data = pd.read_excel('評(píng)論_匯總.xlsx',encoding='utf-8')
text = ''
for i in range(len(data)):
text += data['評(píng)論'][i]
word = jieba.cut(text,cut_all=True) #加了cut_all為全模式有多余的切分
#jieba庫(kù)分詞后的結(jié)果為迭代器蒿讥,所以用join()方式打開,也可以用循環(huán)图张。
word_space_list = ' '.join(word)
#添加停用詞锋拖,停用詞少可以直接寫一個(gè)字典,多的話可以寫在txt文件中讀取祸轮,我采用的是txt文件
with open('stopword.txt',encoding='utf-8') as f:
s=f.read()
'''
#切片方法1
exclude=[]
exclude=s.split() #將字符串切片
'''
#切片方法2
exclude=jieba.cut(s,cut_all=True)
exclude=' '.join(exclude)
#print(exclude)
#生成詞云
wc = WordCloud(font_path='simhei.ttf',#設(shè)置字體
background_color='white',#背景顏色
width=1000,#寬度
height=600,#高度
max_words=100,#最大顯示字?jǐn)?shù)
stopwords=exclude#設(shè)置停用詞
).generate(word_space_list)
wc.to_file('詞云2.png')
當(dāng)然這只是最簡(jiǎn)單的詞云,Wordcloud中的許多參數(shù)我都是使用默認(rèn)侥钳,只規(guī)定了幾個(gè)比較常見(jiàn)的參數(shù)适袜,大家如果有需求可以自己設(shè)定。
上面的代碼中有兩種對(duì)停用詞的切片方法舷夺,如果你的停用詞是一些詞組則用第一種比較好苦酱,如果是句子用第二種切片比較好。
這就是運(yùn)行后的結(jié)果给猾。
參考:https://blog.csdn.net/z463544804/article/details/106797987?utm_source=app
https://blog.csdn.net/qq_46614154/article/details/105682101?utm_source=app
https://www.runoob.com/regexp/regexp-syntax.html
https://www.cnblogs.com/wangyinghao/p/10712328.html
https://www.cnblogs.com/liyanyinng/p/10958791.html
https://blog.csdn.net/YJG7D314/article/details/102787844