爬取微博热搜


一、主题式网络爬虫设计方案
1.主题式网络爬虫名称

爬取微博热搜
2.主题式网络爬虫爬取的内容与数据特征分析

爬取微博热搜前十,热度,排名。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

实现思路:确定爬取网页,初始化信息,依靠request库对目标页面进行信息的爬取采集,用findall方法取标签,将爬取数据保存到csv文件中。对数据进行清理处理,并对数据进行分析与可视化。

二、主题页面的结构特征分析
1.主题页面的结构与特征分析

2.Htmls页面解析

三、网络爬虫程序设计
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
#请求网页
url = 'https://tophub.today/n/KqndgxeLl9'
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'}
response = requests.get(url,headers=headers)#发送get请求
html = response.content.decode('utf-8')#配置编码
html = response.text
#print(html)
#解析网页与抓取信息
titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正则表达
hot = re.findall('<td>(.*?)</td>',html)[0:10]
a = []#创建空列表
for i in range(10):
    a.append([i+1,titles[i],hot[i][:-1]])
#完成创建
file = pd.DataFrame(a,columns = ['排名','标题','热度(单位:万)'])
print(file)
file.to_csv('微博热搜.csv')#保存文件

2.对数据进行清洗和处理

 

#使用read_excel方法读取本地csv文件-微博热搜.csv
rs = pd.DataFrame(pd.read_csv('微博热搜.csv'))
rs.head()

#删除无效列
rs.drop('热度(单位:万)',axis = 1,inplace=True)
rs.head()

#只显示存在缺失值的行列,清楚确定缺失值位置
rs[rs.isnull().values==True].head()

#统计各列的空值情况
print('\n==各列的空值情况如下: ===')
rs.isnull().sum()

#查找重复值
rs.duplicated()

#统计缺失值NaN
rs.isna().head()

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

3.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)

(1)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
filename = '微博热搜.csv'
colnames=["排名","热度(单位:万)","标题"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.标题
#绘制散点图
plt.scatter(X,Y,color='green',label="样本数据",linewidth=2)
#绘制折线图
plt.plot(X,Y,color='red',linewidth=2)
plt.xlabel("排名")
plt.ylabel("热度(单位:万)")
plt.grid()
plt.show()

(2)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3])
index=['1','2','3','4','5','6','7','8','9','10']
s = pd.Series(data,index)
s.name='微博热搜条形图'
s.plot(kind='bar',title='微博热搜条形图')
plt.xlabel(排名)
plt.ylabel(热度)
plt.show()

 

(3)

import seaborn as sns 
rs = pd.read_csv('微博热搜.csv')
sns.distplot(x,color="pink",bins=20,kde=True)
plt.xlabel("排名")
plt.ylabel("热度")
plt.title("排名与热度直方图")
plt.show()

4.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元)

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
filename = '微博热搜.csv'
colnames=["排名","热度(单位:万)","标题"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.标题
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y
p0=[2,4,6]
para=leastsq(error_func,p0,args=(X,Y))
a,b,c=para[0]
plt.figure(figsize=(8,4))
plt.scatter(X,Y,color="pink",label=u"热搜数据",linewidth=2)
x=np.linspace(0,25,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="blue",label=u"拟合直线",linewidth=2)
plt.title("微博热搜回归方程")
plt.legend()
plt.show()

#使用corr()函数,判断两个属性是否具有相关性
df['排名'].corr(df['标题'])

 

5.数据持久化

6.将以上各部分的代码汇总,附上完整程序代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import re
#请求网页
url = 'https://tophub.today/n/KqndgxeLl9'
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'}
response = requests.get(url,headers=headers)#发送get请求
html = response.content.decode('utf-8')#配置编码
html = response.text
#print(html)
#解析网页与抓取信息
titles = re.findall('<a href=.*? target="_blank" .*?>(.*?)</a>',html)[3:13]#正则表达
hot = re.findall('<td>(.*?)</td>',html)[0:10]
a = []#创建空列表
for i in range(10):
    a.append([i+1,titles[i],hot[i][:-1]])
#完成创建
file = pd.DataFrame(a,columns = ['排名','标题','热度(单位:万)'])
print(file)
file.to_csv('微博热搜.csv')#保存文件


#使用read_excel方法读取本地csv文件-微博热搜.csv
rs = pd.DataFrame(pd.read_csv('微博热搜.csv'))
rs.head()

#删除无效列
rs.drop('热度(单位:万)',axis = 1,inplace=True)
rs.head()

#只显示存在缺失值的行列,清楚确定缺失值位置
rs[rs.isnull().values==True].head()

#统计各列的空值情况
print('\n==各列的空值情况如下: ===')
rs.isnull().sum()

#查找重复值
rs.duplicated()

#统计缺失值NaN
rs.isna().head()

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

#绘制散点图和折线图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
filename = '微博热搜.csv'
colnames=["排名","热度(单位:万)","标题"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.标题
#绘制散点图
plt.scatter(X,Y,color='green',label="样本数据",linewidth=2)
#绘制折线图
plt.plot(X,Y,color='red',linewidth=2)
plt.xlabel("排名")
plt.ylabel("热度(单位:万)")
plt.grid()
plt.show()

#绘制条形图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
data=np.array([431.3,135.5,128.0,114.0,112.8,97.0,95.5,93.1,89.9,89.3])
index=['1','2','3','4','5','6','7','8','9','10']
s = pd.Series(data,index)
s.name='微博热搜条形图'
s.plot(kind='bar',title='微博热搜条形图')
plt.xlabel(排名)
plt.ylabel(热度)
plt.show()

#绘制直方图
import seaborn as sns 
rs = pd.read_csv('微博热搜.csv')
sns.distplot(x,color="pink",bins=20,kde=True)
plt.xlabel("排名")
plt.ylabel("热度")
plt.title("排名与热度直方图")
plt.show()

#回归方程
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
filename = '微博热搜.csv'
colnames=["排名","热度(单位:万)","标题"]
df = pd.read_csv(filename,skiprows=1,names=colnames)
X=df.排名
Y=df.标题
def fit_func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error_func(p,x,y):
    return fit_func(p,x)-y
p0=[2,4,6]
para=leastsq(error_func,p0,args=(X,Y))
a,b,c=para[0]
plt.figure(figsize=(8,4))
plt.scatter(X,Y,color="pink",label=u"热搜数据",linewidth=2)
x=np.linspace(0,25,20)
y=a*x*x+b*x+c
plt.plot(x,y,color="blue",label=u"拟合直线",linewidth=2)
plt.title("微博热搜回归方程")
plt.legend()
plt.show()

#使用corr()函数,判断两个属性是否具有相关性
df['排名'].corr(df['标题'])

 

四结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?

通过对数据的分析与可视化,可以清楚的展现出微博热搜排名与热度的变化,更直观的体现热度的变化。
2.对本次程序设计任务完成的情况做一个简单的小结。

通过此次的设计作业,学习到了细心和耐心,也一定程度上加深了我对python网络爬虫的了解,也对爬虫更加的感兴趣,发现爬取的数据更能真实反映出数据变化。对于此次设计作业,一开始代码出现很多问题,通过不断的回看上课视频,查找资料,慢慢的能够实质上的解决,但仍有很多不足之处。对于xpath,正则表达等不能很好地处理。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM