一、前言
淘宝的反爬比较严格,且淘宝协议好像不允许爬取它的评论,我查了一下好像也不建议直接用自己的淘宝号去爬取(好像有封号风险),我在测试的时候,可能是太频繁了淘宝账号被强制退了并提醒了用户协议。话不多说,我们直接来看一下思路和代码。
二、实例
1、思路
因为淘宝反爬比较严重,所以该代码需要登录淘宝账号模仿人为浏览复制评论,且需要提供较为详细的URL,还要提供cookie等。
2、过程
明确自己所要找的商品评论,进入相应的商品中,我以小米手机为例。
我这里进入了小米旗舰店的米10的评论区中。
这个时候,打开开发者模式(按f12)
第一步点击图中的放大镜,如果4中的搜索框有内容,则按一下步骤2的那个禁止符号清除搜索框中的内容,要是原本就没有内容就跳过第二步直接点击3中的具体评论。
注:这里一定要先进入开发者模式再去点击评论,如果是先点击具体评论在打开开发者模式复制黏贴,会搜索不到内容的,也就找不到对应的URL等参数了!!!
选择一条评论复制,然后黏贴到4中的搜索框去,点一下5,或者按一下回车键,出现以下内容。
点击画红线的地方。
出现上面的页面点到headers去
这里我们看到了页面的URL,我们往下拉还可以看见cookie,referer,user-agent,要将这四个找出来分别黏贴在下面的代码中。注意上图画红线的地方,在下面会进行特别的说明。
3、代码
import pandas as pd
import requests
import re
import time
data_list = []
#爬取的页数为1到19页
for i in range(1,20,1):
print("正在爬取第" + str(i) + "页")
#构建访问的网址,这个网址可有讲究了
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
#访问的头文件,还带这个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',
# 从哪个页面发出的数据申请,每个网站可能略有不同
'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',
# 哪个用户想要看数据,是游客还是注册用户,建议使用登录后的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'
}
#尝试获取数据(这里的数据应该是从json里面获取的)
try:
data = requests.get(url,headers = headers).text
time.sleep(10)#设置睡眠时间,模拟人的浏览
result = re.findall('rateContent":"(.*?)"fromMall"',data)
data_list.extend(result)
except:
print("本页爬取失败")
df = pd.DataFrame()
df["评论"] = data_list
df.to_excel("评论_汇总1.xlsx")
cookie,referer,user-agent这三个直接找到复制黏贴就好了,但是URL我们需要分为两部分,分隔的地方就在上面图中画红线处。将其分为first和last黏贴进去。
为什么要这这里分隔呢?
我们要明白,我们爬取的是多页评论,而在淘宝中评论页面是局部页面,currentPage这个参数指的是当前页,我们可以看见上面截图中它的值为1,因为我在第一页评论中,可以注意到代码中在first后面的”currentPage=”没有具体的值,它的值在下面代码url = first + str(i) + last,我用str(i)赋值了。
【注:上面用到了requests库来获取页面信息,requests库的使用可以参考这篇文章。还利用了正则化表达式来提取评论,大家如果将爬取的最初始结果data输出会看到一堆乱七八糟的符号文字等,仔细看会发现评论都是在"rateContent"和"fromMall"之间,所以用正则表达式将评论从爬取的内容中提取出来。】
最后得到的结果如下图:
三、制作词云
词云的制作,比较简单,一些解释我已经备注在代码中了,所以直接看代码就好。
import jieba
import pandas as pd
from wordcloud import WordCloud
#读取文件,如果是xlsx则用utf-8编码,若是CSV文件则用gbk编码
data = pd.read_excel('评论_汇总.xlsx',encoding='utf-8')
text = ''
for i in range(len(data)):
text += data['评论'][i]
word = jieba.cut(text,cut_all=True) #加了cut_all为全模式有多余的切分
#jieba库分词后的结果为迭代器,所以用join()方式打开,也可以用循环。
word_space_list = ' '.join(word)
#添加停用词,停用词少可以直接写一个字典,多的话可以写在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',#设置字体
background_color='white',#背景颜色
width=1000,#宽度
height=600,#高度
max_words=100,#最大显示字数
stopwords=exclude#设置停用词
).generate(word_space_list)
wc.to_file('词云2.png')
当然这只是最简单的词云,Wordcloud中的许多参数我都是使用默认,只规定了几个比较常见的参数,大家如果有需求可以自己设定。
上面的代码中有两种对停用词的切片方法,如果你的停用词是一些词组则用第一种比较好,如果是句子用第二种切片比较好。
这就是运行后的结果。
参考: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