工作细胞 爬虫解析

工作细胞爬虫解析

如果不巧进行的是大神,可以转看原文噢!!

地址:https://mp.weixin.qq.com/s/E4EEgmQverifK5mc6W8onw

因为我是菜鸟,所以,只是再自己的机子上尝试一下大神的杰作,代码还是上述文中的代码。不过,我遇到了很多坑,我相信,这也是很多新手也会遇到的坑,所以,我也就记录一下。我也觉得,反正多尝试一下别人的代码,你可以一步一步跟我做,如果遇到什么问题,可以留言噢!多学,多练,自己至少会更有成就感!!哈哈!!

正文

首先,贴一下工作细胞这个动漫的地址:https://search.bilibili.com/all?keyword=工作细胞&from_source=banner_search

代码
Spyder_data

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  9 09:40:08 2018

@author: zwz
"""

import requests
from fake_useragent import UserAgent
import json
import pandas as pd
import time
import datetime
headers = { "User-Agent": UserAgent(verify_ssl=False).random}
comment_api = 'https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0'
# 发送get请求
response_comment = requests.get(comment_api,headers = headers)
json_comment = response_comment.text
json_comment = json.loads(json_comment)
total = json_comment['result']['total']
cols = ['author','score','disliked','likes','liked','ctime','score','content','last_ep_index','cursor']
dataall = pd.DataFrame(index = range(total),columns = cols)
j = 0
while j <100:
    n = len(json_comment['result']['list'])
    for i in range(n):
        dataall.loc[j,'author'] = json_comment['result']['list'][i]['author']['uname']
        dataall.loc[j,'score'] = json_comment['result']['list'][i]['user_rating']['score']
        dataall.loc[j,'disliked'] = json_comment['result']['list'][i]['disliked']
        dataall.loc[j,'likes'] = json_comment['result']['list'][i]['likes']
        dataall.loc[j,'liked'] = json_comment['result']['list'][i]['liked']
        dataall.loc[j,'ctime'] = json_comment['result']['list'][i]['ctime']
        dataall.loc[j,'content'] = json_comment['result']['list'][i]['content']
        dataall.loc[j,'cursor'] = json_comment['result']['list'][n-1]['cursor'] 
        j+= 1
    try:        
        dataall.loc[j,'last_ep_index'] = json_comment['result']['list'][i]['user_season']['last_ep_index']
    except:
        pass

    comment_api1 = comment_api + '&cursor=' + dataall.loc[j-1,'cursor'] 
    response_comment = requests.get(comment_api1,headers = headers)
    json_comment = response_comment.text
    json_comment = json.loads(json_comment)
    
    if j % 50 ==0:
        print('已完成 {}% !'.format(round(j/total*100,2)))
    time.sleep(0.5)
dataall = dataall.fillna(0)
def getDate(x):
    x = time.gmtime(x)
    return(pd.Timestamp(datetime.datetime(x[0],x[1],x[2],x[3],x[4],x[5])))
dataall['date'] = dataall.ctime.apply(lambda x:getDate(x))
dataall.to_csv('bilibilib_gongzuoxibao.csv',index = True)

如果你是一个新手,肯定就会报出很多错误,老手也是一样的,因为确实有可能有些包没没有装,如果没有装,就直接pip install 包名

接下来,我们看一下注意事项。

  • 首先,测试bibli的地址是否有更改
    comment_api = 'https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0'

  • while j <100:
    注意在测试阶段更改一下这行的代码,原文的代码是:while j<total
    这里的total 是非常大的数,会让你测非常久。

  • dataall.to_csv('bilibilib_gongzuoxibao.csv',index = True)
    这里生成的文件,会在工程目录下,去找找就会找到。

我们看一下效果
在这里插入图片描述
这里,你的文件可能会格式不正确,只要更改一下,数据的类型,如常规->文本
就可以看到这个了。

接下来,我们进行数据处理

# -*- coding: utf-8 -*-
"""
Created on Fri Nov  9 09:40:08 2018
@author: zwz
"""
import pandas as pd
from pyecharts import Pie,Line,Scatter
import os 
import numpy as np
import jieba
import jieba.analyse
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r'c:\windows\fonts\simsun.ttc')#,size=20指定本机的汉字字体位置
os.chdir('D:\data_work')
datas = pd.read_csv('bilibilib_gongzuoxibao.csv',index_col = 0,encoding = 'utf-8')
"""
描述性分析
"""
del datas['ctime']
del datas['cursor']
del datas['liked']
# 评分
scores = datas.score.groupby(datas['score']).count()
pie1 = Pie("评分", title_pos='center', width=900)
pie1.add(
    "评分",
    ['一星','二星','三星','四星','五星'],
    scores.values,
    radius=[40, 75],
#    center=[50, 50],
    is_random=True,
#    radius=[30, 75],
    is_legend_show=False,
    is_label_show=True,
)
pie1.render('评分.html')
datas['dates'] = datas.date.apply(lambda x:pd.Timestamp(x).date())
datas['time'] = datas.date.apply(lambda x:pd.Timestamp(x).time().hour)
num_date = datas.author.groupby(datas['dates']).count()
# 评论数时间分布
chart = Line("评论数时间分布")
chart.use_theme('dark')
chart.add( '评论数时间分布',num_date.index, num_date.values, is_fill=True, line_opacity=0.2,
          area_opacity=0.4, symbol=None)
chart.render('评论时间分布.html')
# 好评字数分布
datalikes = datas.loc[datas.likes>5]
datalikes['num'] = datalikes.content.apply(lambda x:len(x))
chart = Scatter("likes")
chart.use_theme('dark')
chart.add('likes', np.log(datalikes.likes), datalikes.num, is_visualmap=True,
               xaxis_name = 'log(评论字数)',           
          )
chart.render('好评字数分布.html')
# 评论每日内的时间分布
num_time = datas.author.groupby(datas['time']).count()
# 时间分布
chart = Line("评论日内时间分布")
chart.use_theme('dark')
chart.add("评论数", x_axis = num_time.index.values,y_axis = num_time.values,
          is_label_show=True,
          mark_point_symbol='diamond', mark_point_textcolor='#40ff27',
          line_width = 2
          )

chart.render('评论日内时间分布.html')
# 时间分布
chart = Line("评论数时间分布")
chart.use_theme('dark')
chart.add( '评论数时间分布',num_date.index, num_date.values, is_fill=True, line_opacity=0.2,
          area_opacity=0.4, symbol=None)

chart.render('评论时间分布.html')
# 评分时间分布
datascore = datas.score.groupby(datas.dates).mean()
chart = Line("评分时间分布")
chart.use_theme('dark')
chart.add('评分', datascore.index, 
          datascore.values, 
          line_width = 2            
          )
chart.render('评分时间分布.html')
"""
评论分析
"""
texts = ';'.join(datas.content.tolist())
cut_text = " ".join(jieba.cut(texts))
# TF_IDF
keywords = jieba.analyse.extract_tags(cut_text, topK=500, withWeight=True, allowPOS=('a','e','n','nr','ns'))
text_cloud = dict(keywords)
pd.DataFrame(keywords).to_excel('TF_IDF关键词前500.xlsx')

bg = plt.imread("工作细胞1.jpg")
# 生成
wc = WordCloud(# FFFAE3
    background_color="white",  # 设置背景为白色,默认为黑色
    width=400,  # 设置图片的宽度
    height=600,  # 设置图片的高度
    mask=bg,
    random_state = 2,
    max_font_size=500,  # 显示的最大的字体大小
    font_path="STSONG.TTF",  
).generate_from_frequencies(text_cloud)
# 为图片设置字体

# 图片背景
bg_color = ImageColorGenerator(bg)
plt.imshow(wc.recolor(color_func=bg_color))
plt.imshow(wc)
# 为云图去掉坐标轴
plt.axis("off")
plt.show()
wc.to_file("词云.png")
  • 这里,你应该也会有各种包的缺失的问题,pip下就行了。建议安装anaconda,如果你不知道这个东西的话。

注意事项

  • os.chdir('D:\data_work')注意这行代码,要更改成你机子上面的目录,后面文件生成都在这个目录下。
  • datas = pd.read_csv('bilibilib_gongzuoxibao.csv',index_col = 0,encoding = 'utf-8')你要保证,我们上一个代码生成的文件也在这个目录下,文件名记得更改。
  • bg = plt.imread("工作细胞1.jpg")这里的照片,你要自己去下载一个,然后放进去上面的那个data_work。切记,这里的照片,尽量一定要找高清的,不然,词云出来的效果会让你感到非常遗憾。这里提供一个高清图片下载的网站:Beautiful free image这里你随便下载一个图片就行。
  • 现在基本上就可以开始运行了。
    效果:
    在这里插入图片描述
    这里便是生成的词云,有点丑,不过,字体的效果还是不错 的,遗憾的是我的背景图没有显现出来,不像原文中的图片。
    在这里插入图片描述
    好评字数分布
    在这里插入图片描述
    评分
    在这里插入图片描述
    评分时间分布
    在这里插入图片描述
    评论日内时间分布
    在这里插入图片描述
    评论时间分布
    在这里插入图片描述
  • 因为我只爬取了100条数据,所以,数据显得非常集中,如果要想爬更多的数据,可以修改一下上面的代码,在那个while j<100那个地方。
  • 还是要不断修改,等以后,我知道怎么改了,再过来改吧!
  • 也希望有大神进行指导一下噢,感谢!

参考文献
1.https://mp.weixin.qq.com/s/E4EEgmQverifK5mc6W8onw

猜你喜欢

转载自blog.csdn.net/weixin_38809485/article/details/83892939