爬⾍:python采集⾖瓣影评信息并进⾏数据分析
前⾔:最近⽐较有时间,替⼀个同学完成了⼀个简单的爬⾍和数据分析任务,具体的要求是爬取复仇者联盟4 的⾖瓣影评信息并进⾏简单的数据分析,这⾥的数据分析指的是提
取关键词并进⾏词云分析以及按照时间进⾏热度分析,分析⽐较简单,后续可以继续完善。
⾸先,献上数据采集和分析的结果。
短评数据
按照该同学的要求,只采集了1000条数据,有需要更多数据的同学可⾃⾏修改采集的限制即可
下⾯,我们就来详细描述下如何完成数据采集和数据分析的⼯作的
⾸先,爬⾍的第⼀步,分析页⾯元素,打开⽹页,按下F12,查看数据请求
从上往下,依次寻,我们可以发现数据就存在于第⼀个请求中
我们可以分析下这个请求,点击翻页,多请求⼏个页⾯
我们可以知道他的翻页规律是由start和limit这两个参数来控制的,start表⽰第⼏页,limit表⽰每页多少条
知道他的分页规律后,我们需要定位我们需要采集的元素,我们这⾥需要采集短评内容、发布⼈信息、评价指数、评价时间,赞同数等
这⾥我们选择的是etree+xpath解析数据,这⾥我给⼤家演⽰下如何定位短评内容,我们采⽤浏览器上的选中元素的功能,选中元素后,查看元素的位置
分析对应的html元素,⾸先到改元素最可靠的顶级元素,这⾥我们可以很容易的发现这个元素是位于id="comments"这个div元素下⾯,⼀般⽽⾔,以id为准的元素不会发⽣太
⼤的变化,接着,我们继续往下,到对应元素的上级中⽐较可靠的元素,⽐如class,这⾥有个⼩技巧,我们可以利⽤浏览器的$x⽅法验证我们的xpath是否正确,像下⾯这
样
这样我们就可以很容易的采集到短评数据了,代码如下
def start_spider(self):
result_list = []
for i in range(0,50):
start = i
reponse = (self.target_url.format(start),headers=self.headers)
# )
html = etree.HTML(t,'utf-8'))
# 短评列表
short_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="short"]/text()')
print(short_list)
times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[2]/@class')
complte_times = html.xpath('//div[@class="comment-item"]//span[@class="comment-info"]/span[3]/@title')
votes = html.xpath('//div[@class="comment-item"]//div[@class="comment"]/h3/span[@class="commen
t-vote"]/span[@class="votes"]/text()') # 赞同量
采集了短评数据,我们还需要采集发布⼈的⼀些其他信息,⽐如注册时间,常驻城市等等
因此我们需要根据这个链接去⽤户的主页完成信息采集
采集的原理也是⼀样,利⽤xpath解析⽹页数据,不过这个链接需要注意的是,需要登录后才能请求,我这个爬⾍⾥⾯的解决办法是利⽤cookie,
当我们⽤账户登录后,随便查看⼀个请求,都能发现我们的cookie信息
直接复制这段请求到请求的header⾥就⾏
代码如下
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
'Cookie': 'll="118281"; bid=1E8tHh1UO7k; __utma=30149280.787827060.1593838175.1593838175.1593838175.1; __utmc=30149280; __utmz=30149280.1593838175.1.1.utmcsr=so|utmccn=(referral)|utmcmd=referral|utmcct=/link; ap_v }
# ⽤户链接列表
user_list = html.xpath('//div[@id="comments"]/div[@class="comment-item"]//span[@class="comment-info"]/a/@href')
for i in range(len(user_list)):
url = user_list[i]
item = {'short':self.clear_character_chinese(str(short_list[i]))}
reponse = (url,headers=self.headers)
html = etree.)
city = html.xpath('//div[@class="user-info"]/a/text()')
join_date = html.xpath('//div[@class="user-info"]/div[@class="pl"]/text()')
if(city != None):
xpath语法 pythonif(len(city) > 0):
item['city'] = self.clear_character_chinese(city[0])
else:
continue
if(join_date != None):
if(len(join_date)>1):
item['join_date'] = self.clear_character_chinese(join_date[1]).replace("加⼊","")
elif(len(join_date)>0):
item['join_date'] = self.clear_character_chinese(join_date[0]).replace("加⼊","")
else:
continue
user_name = html.xpath('//div[@class="info"]/h1/text()')
爬⾍的代码基本就这些,我们这⾥是存储为excel⽂件,代码如下
# # 保存数据到excel⽂件
def saveToCsv(self,data):
print(data)
wb = Workbook()
ws = wb.active
ws.append(['短评内容','评分','赞同量','评价⽇期','评价时间', '⽤户名', '常住地址','注册时间'])
for item in data:
line = [item['short'], item['time'],item['vote'],item['complete_time'],item['detail_time'], item['userName'],item['city'],item['join_date']]
ws.append(line)
wb.save('douban.xlsx')
保存的数据如开篇所⽰
获得了数据之后,我们利⽤wordcloud进⾏词云分析,分别分析出全部、好评、中评、差评等数据的词云,代码如下
# 读取短评内容
def read_short_data(self,word_type):
data = []
workbook1=load_workbook('douban.xlsx')
_sheet_by_name("Sheet")
count = 0
for row in sheet.iter_rows():
if(count == 0):
count = 1
continue
print(row[0].value)
short = row[0].value
short_type = row[1].value
if (word_type == 1):
if (int(short_type)<40):
continue
elif(word_type == 2):
if (int(short_type)>=40 or int(short_type)<=20):
continue
elif(word_type == 3):
if (int(short_type)>20):
continue
short = self.clean_stopwords(short)
data.append(short)
return ";".join(data)
def generWord(self,word_type):
# 查询数据
content = ad_short_data(word_type)
msg = "全部"
if(word_type == 1):
msg = "好评"
elif(word_type == 2):
msg = "中评"
elif(word_type == 3):
msg = "差评"
<_image(content,"douban_{}.png".format(msg))
# ⽣成词云
def get_image(self,data,savePath):
text = ans_CN(data)
wordcloud = WordCloud(
background_color="white",
font_path = "C:\\Windows\\Fonts\\"
).generate(text)
# image_produce = _image()
# image_produce.show()
<_file(savePath)
词云出来的结果如下所⽰
好评
中评
差评
全部
分析了词云,我们接着完成时间分析,因为采集的数据太少,分析结果不是很好,代码如下
# 时间分析
def group_by(self,column):
workbook1=load_workbook('douban.xlsx')
_sheet_by_name("Sheet")
count = 0
item={}
for row in sheet.iter_rows():
if(count == 0):
count = 1
continue
print(row[0].value)
join_time = row[column].value
if (column == 4):
join_time_str = join_time.split(':')[0]
join_time = int(join_time_str)
if(join_time in item):
item[join_time] = item[join_time]+1
else:
item[join_time] = 1
x = []
y = []
for i in sorted (item) :
if(column == 4):
join_time = str(int(i))+'点⾄'+str(int(i)+1)+'点'
x.append(join_time)
else:
x.append(i)
y.append(item[i])
if(column == 4):
plt.xlabel('⽇期')
else:
plt.xlabel('时刻')
plt.ylabel('短评数量')
print(y)
plt.plot(x, y)
if(column == 4):
plt.title('短评数量随着时刻的变化关系')
else:
plt.title('短评数量随着⽇期的变化关系')
if(column == 4):
plt.savefig('group_bytime.png')
else:
plt.savefig('group_bydate.png')
这⾥只分析了短评数量的变化,实际上数据中还有很多可以分析的内容,分析结果如下
通过这两个分析结果,我们可以⼤致看出,复仇者联盟这部电影关⼼的⼈数随着时间的推进,下降很多,这说明⼤家都是奔着第⼀天的热度去的,毕竟被剧透了就没啥好看的了,分析这个时刻的变化,发现⼈们都喜欢在深夜2、3点的时候进⾏评价,可能夜猫⼦⽐较多,由于这只是⼀个学⽣的简单作业,就没有做太多的分析⼯作。
以上就是本⽂的全部内容,如果需要完整源码的可联系站长或者访问右侧的爬⾍开源项⽬,上⾯有该项⽬的完整代码及分析结果,如果对你有帮助,不妨star⼀下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论