对微博热搜的爬取及数据分析

您所在的位置:网站首页 热搜数据分析怎么做 对微博热搜的爬取及数据分析

对微博热搜的爬取及数据分析

2023-07-02 23:08| 来源: 网络整理| 查看: 265

用 Python 实现一个面向主题的网络爬虫程序,并完成以下内容: 【要求:】 ●每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台。 ●课程设计要求独立完成,可以参考网络资源,但不能全盘抄袭,整个设计代码 应有一定的规模( 300 行左右)。 ●课程设计占总成绩的 60%。 一、选题的背景 为什么要选择此选题?要达到的数据分析的预期目标是什么?(10 分)从社会、经济、技术、数据来源等方面进行描述(200 字以内)   随着时代的进步,微博已成为人们获取重大消息的主要途径之一。所以我想对微博热搜榜前40进行数据爬取,然后进行可视化分析。数据分析的目标是通过python中的matplotlib、pandas、seaborn、wordcloud、jieba等库做出图表和云词图让我们能快速精确地知道发生了什么重大事件和了解每天的热搜信息。   二、主题式网络爬虫设计方案( 10 分) 1.主题式网络爬虫名称 对微博热搜的爬取及数据分析 2.主题式网络爬虫爬取的内容与数据特征分析 爬虫爬取的内容:爬取微博热搜的数据;    数据特征分析:各数据分布紧密联系 3.主题式网络爬虫设计方案概述(包括实现思路与技术难点) 实现思路:通过访问网页源代码使用xpath正则表达爬取数据,对数据进行保存数据,再对数据进行清洗和处理,数据分析与可视化处理。 技术难点:在编程的过程中,若中间部分出现错误,可能导致整个代码需要重新修改。数据实时更新,会导致部分上传的图形不一致。   三、主题页面的结构特征分析(10 分) 1.主题页面的结构与特征分析  通过观察页面HTML源代码,可以发现爬取数据都分布在标签'div.cc-cd-cb nano has-scrollbar'里面,标题标签为'span.t',热度标签为'span.e'。 2.Htmls 页面解析 我爬取的网站是https://tophub.today/ 具体为先确定爬取的是2021年12月22日微博的热搜排名、今日热搜和热度 通过F12,对页面进行检查,查看我们所需要爬取内容的相关代码

 

 

 

  四、网络爬虫程序设计(60 分) 爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后 面提供输出结果的截图。 1.数据爬取与采集 通过运用python中的requests、lxml、pandas库对网页进行爬取数据,然后将数据存为csv文件。 import requests from lxml import etree import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib from scipy.optimize import leastsq import scipy.stats as sts import seaborn as sns url = "https://tophub.today/" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'} html = requests.get(url,headers = headers) html = html.content.decode('utf-8') html = etree.HTML(html) div = html.xpath("//div[@id='node-1']/div") for a in div: titles = a.xpath(".//span[@class='t']/text()") numbers = a.xpath(".//span[@class='e']/text()") b = [] for i in range(40): b.append([i+1,titles[i],numbers[i][:-1]]) file = pd.DataFrame(b,columns = ['排名','今日热搜','热度(单位为万)']) print(file) file.to_csv('微博热搜榜热度数据.csv')

 

 

 

2.对数据进行清洗和处理 import pandas as pd import numpy as np import matplotlib.pyplot as plt #读取csv文件 s=pd.read_csv("微博热搜榜热度数据.csv") s

 

 

进行重复值处理,检查是否有重复值

s.duplicated() #检查是否有重复值

 

 

 从以上得知该数据没有重复值。

接下去对数据进行查看统计信息

 

#使用describe查看统计信息 s.describe()

 

 

 

s.info() #查看各列数据类型

 

 

 

  4.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)   #绘制折线图import pandas as pd import numpy as np import matplotlib.pyplot as plt data=pd.read_csv("微博热搜榜热度数据.csv") s=(data.head(20)) plt.rcParams['font.sans-serif'] = 'simhei' plt.rcParams['axes.unicode_minus']=False s = np.array(s) plt.plot(s[:,1],s[:,3],'-*') plt.xlabel("排行榜") plt.title(u'微博热搜榜热度数据') plt.show()

 

 

#绘制柱形图import pandas as pd import numpy as np import matplotlib.pyplot as plt data=pd.read_csv("微博热搜榜热度数据.csv") s=(data.head(10)) plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig = plt.figure() plt.bar(s['排名'], s['热度(单位为万)']) plt.title(u'微博热搜榜热度数据') plt.xlabel('排名', size=10) plt.ylabel(u'热度(单位为万)') plt.show()

 

 

#绘制饼图import pandas as pd import numpy as np import matplotlib.pyplot as plt data=pd.read_csv("微博热搜榜热度数据.csv") s=(data.head(15)) plt.rcParams['font.sans-serif'] = ['SimHei'] #解决乱码问题 df_score = s['热度(单位为万)'].value_counts() #统计评分情况 plt.title("微博热搜榜热度数据分布情况") #设置饼图标题 plt.pie(df_score.values,labels = df_score.index,autopct='%1.1f%%') #绘图 #autopct表示圆里面的文本格式,在python里%操作符可用于格式化字符串操作 plt.show()

 

 

 

5.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变 量之间的回归方程(一元或多元)。 #线性回归图import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns df=pd.read_csv("微博热搜榜热度数据.csv") sns.lmplot(x='排名',y='热度(单位为万)',data=df) plt.show()

 

#排名与热度散点图import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns df=pd.read_csv("微博热搜榜热度数据.csv") x = df['排名'] y = df['热度(单位为万)'] plt.xlabel('排名') plt.ylabel('热度(单位为万)') plt.scatter(x,y,color="red",label=u"热度分布数据",linewidth=2) plt.title("绘制排名与热度散点图") plt.legend() plt.show()

由于csv文件不能直接读取,所以将csv文件转为txt文件。

import pandas as pd data = pd.read_csv("微博热搜榜热度数据.csv") s=data.iloc[:,1:4] s.to_csv('微博热搜榜热度数据.txt',index=False,sep=' ',encoding='utf_8_sig')

 

 

 

#绘制词云import jieba from matplotlib import pyplot as plt from wordcloud import WordCloud from PIL import Image import numpy as np #r''单引号里面不需要转义 from os import path #绘制图片 from wordcloud import WordCloud,ImageColorGenerator import jieba import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np img = mpimg.imread('微博.jpg') print (img.shape) plt.imshow(img) font = r'C:\Windows\Fonts\FZSTK.TTF' #电脑自带的字体 def tcg(texts): cut = jieba.cut(texts) #分词 string = ' '.join(cut) return string text = (open('微博热搜榜热度数据.txt','r',encoding='utf-8')).read() string=tcg(text) img_array = np.array(img) #将图片装换为数组 stopword=[''] #设置停止词,也就是你不想显示的词 wc = WordCloud( background_color='white', width=1000, height=800, mask=img_array, #设置背景图片 font_path=font, stopwords=stopword ) wc.generate_from_text(string)#绘制图片 plt.imshow(wc) plt.axis('off') plt.show() wc.to_file('微博热搜榜热度数据.jpg')

 

 

 

7.将以上各部分的代码汇总,附上完整程序代码 1 #导入库 2 3 import requests 4 from lxml import etree 5 import pandas as pd 6 import numpy as np 7 import matplotlib.pyplot as plt 8 import matplotlib 9 from scipy.optimize import leastsq 10 import scipy.stats as sts 11 import seaborn as sns 12 13 url = "https://tophub.today/" 14 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'} 15 html = requests.get(url,headers = headers) 16 17 html = html.content.decode('utf-8') 18 html = etree.HTML(html) 19 20 div = html.xpath("//div[@id='node-1']/div") 21 for a in div: 22 titles = a.xpath(".//span[@class='t']/text()") 23 numbers = a.xpath(".//span[@class='e']/text()") 24 25 b = [] 26 for i in range(40): 27 b.append([i+1,titles[i],numbers[i][:-1]]) 28 file = pd.DataFrame(b,columns = ['排名','今日热搜','热度(单位为万)']) 29 print(file) 30 file.to_csv('微博热搜榜热度数据.csv') 31 32 #爬取数据,然后将数据存为csv文件 33 34 35 import pandas as pd 36 import numpy as np 37 import matplotlib.pyplot as plt 38 #读取csv文件 39 s=pd.read_csv("微博热搜榜热度数据.csv") 40 s 41 42 43 s.duplicated() 44 45 #检查是否有重复值 46 47 48 #使用describe查看统计信息 49 50 s.describe() 51 52 53 s.info() 54 55 #查看各列数据类型 56 57 58 #绘制折线图 59 60 import pandas as pd 61 import numpy as np 62 import matplotlib.pyplot as plt 63 data=pd.read_csv("微博热搜榜热度数据.csv") 64 s=(data.head(20)) 65 plt.rcParams['font.sans-serif'] = 'simhei' 66 plt.rcParams['axes.unicode_minus']=False 67 s = np.array(s) 68 plt.plot(s[:,1],s[:,3],'-*') 69 plt.xlabel("排行榜") 70 plt.title(u'微博热搜榜热度数据') 71 plt.show() 72 73 74 #绘制柱形图 75 76 import pandas as pd 77 import numpy as np 78 import matplotlib.pyplot as plt 79 data=pd.read_csv("微博热搜榜热度数据.csv") 80 s=(data.head(10)) 81 plt.rcParams['font.sans-serif']=['SimHei'] 82 plt.rcParams['axes.unicode_minus'] = False 83 fig = plt.figure() 84 plt.bar(s['排名'], s['热度(单位为万)']) 85 plt.title(u'微博热搜榜热度数据') 86 plt.xlabel('排名', size=10) 87 plt.ylabel(u'热度(单位为万)') 88 plt.show() 89 90 91 #绘制饼图 92 93 import pandas as pd 94 import numpy as np 95 import matplotlib.pyplot as plt 96 data=pd.read_csv("微博热搜榜热度数据.csv") 97 s=(data.head(15)) 98 plt.rcParams['font.sans-serif'] = ['SimHei'] 99 #解决乱码问题 100 101 df_score = s['热度(单位为万)'].value_counts() 102 #统计评分情况 103 104 plt.title("微博热搜榜热度数据分布情况") 105 #设置饼图标题 106 107 plt.pie(df_score.values,labels = df_score.index,autopct='%1.1f%%') 108 #绘图 109 #autopct表示圆里面的文本格式,在python里%操作符可用于格式化字符串操作 110 111 plt.show() 112 113 114 #绘制线性回归图 115 116 import pandas as pd 117 import numpy as np 118 import matplotlib.pyplot as plt 119 import seaborn as sns 120 df=pd.read_csv("微博热搜榜热度数据.csv") 121 sns.lmplot(x='排名',y='热度(单位为万)',data=df) 122 plt.show() 123 124 125 #绘制排名与热度散点图 126 import pandas as pd 127 import numpy as np 128 import matplotlib.pyplot as plt 129 import seaborn as sns 130 df=pd.read_csv("微博热搜榜热度数据.csv") 131 x = df['排名'] 132 y = df['热度(单位为万)'] 133 plt.xlabel('排名') 134 plt.ylabel('热度(单位为万)') 135 plt.scatter(x,y,color="red",label=u"热度分布数据",linewidth=2) 136 plt.title("绘制排名与热度散点图") 137 plt.legend() 138 plt.show() 139 140 141 #将csv文件转为txt文件 142 import pandas as pd 143 data = pd.read_csv("微博热搜榜热度数据.csv") 144 s=data.iloc[:,1:4] 145 s.to_csv('微博热搜榜热度数据.txt',index=False,sep=' ',encoding='utf_8_sig') 146 147 148 #绘制词云 149 import jieba 150 from matplotlib import pyplot as plt 151 from wordcloud import WordCloud 152 from PIL import Image 153 import numpy as np 154 #r''单引号里面不需要转义 155 from os import path 156 #绘制图片 157 from wordcloud import WordCloud,ImageColorGenerator 158 import jieba 159 import matplotlib.pyplot as plt 160 import matplotlib.image as mpimg 161 import numpy as np 162 img = mpimg.imread('微博.jpg') 163 print (img.shape) 164 plt.imshow(img) 165 font = r'C:\Windows\Fonts\FZSTK.TTF' 166 #电脑自带的字体 167 def tcg(texts): 168 cut = jieba.cut(texts) 169 #分词 170 string = ' '.join(cut) 171 return string 172 text = (open('微博热搜榜热度数据.txt','r',encoding='utf-8')).read() 173 string=tcg(text) 174 img_array = np.array(img) 175 #将图片装换为数组 176 stopword=[''] 177 #设置停止词,也就是你不想显示的词 178 wc = WordCloud( 179 background_color='white', 180 width=1000, 181 height=800, 182 mask=img_array, 183 #设置背景图片 184 font_path=font, 185 stopwords=stopword 186 ) 187 wc.generate_from_text(string)#绘制图片 188 plt.imshow(wc) 189 plt.axis('off') 190 plt.show() 191 wc.to_file('微博热搜榜热度数据.jpg')

五、总结(10 分)

1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标? 结论:1、top40的微博热度集中在100万左右。2、微博热点前十名的热点在100万到1000万居多。 已达到预期的目标,通过爬虫技术对爬取到的微博热搜的热度等有了了解,发现娱乐类新闻更容易上热搜。 2.在完成此设计过程中,得到哪些收获?以及要改进的建议? 收获:能够更好地用爬虫技术对网页进行爬取等 建议:对python库的应用还不够娴熟,在编程过程中,中间部分若出错则可能需要整个代码重新修改。要加强python的学习。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3