Python网络爬虫——爬取夸克热搜排行榜
Python网络爬虫——爬取夸克热搜排行榜
一、 选题的背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?(10分)
从社会、经济、技术、数据来源等方面进行描述(200字以内)
疫情的爆发使无数的人无法离开家门,那么他们都依靠什么来缓解焦虑呢。阿里巴巴旗下智能搜索APP夸克发布的数据报告显示,我们熟悉的生活却从未走远:有人走进厨房用美食治愈自己,有人关注和萌宠的相处之道,还有人规划起了疫情之后的旅行。
二、主题式网络爬虫设计方案(10分)
1.主题式网络爬虫名称
Python网络爬虫——爬取夸克热搜排行榜
2.主题式网络爬虫爬取的内容与数据特征分析
爬取今日的热搜数据做可视化处理
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
步骤:首先,先确定此次的选题的主题内容,然后爬取夸克热搜排行,设计爬取程序进行爬取(爬取内容时会遇到爬出来的数据为***万人,思考如何将此数据变成数字),将爬取的数据做成xsl表格时(
1. 创建workbook2.创建worsheet3.数据写入sheet4.数据写入sheet5.保存到excel),接着进行可视化处理。最后,保存数据。
三、主题页面的结构特征分析
1.主题页面的结构与特征分析
我们所需的网站夸克热搜排行榜(https://quark.sm.cn/sfrom=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26)从此获取热搜的排名,热搜事件和热度
寻找出我们需要爬取的东西。
2.htmls页面解析
3.节点(标签)查找方法与遍历方法(必要时画出节点树结构)
四、网络爬虫程序设计
from bs4 import BeautifulSoup
import re
import urllib.request,urllib.error
import xlwt
import sqlite3
def getData(url):
datalist = []
html = askURL(url)
soup = BeautifulSoup(html,"html.parser")
i=1
for item in soup.find_all('a', class_="news-top-list-item c-padding-top-l c-border-bottom c-padding-bottom-l"):
data = []
item = str(item)
pm = i
i=i+1
data.append(pm)
#测试print(item)
findbt = re.compile(r'</span>(.*?)<span class="news-top-list-item-number')
bt = re.findall(findbt, item)[0]
data.append(bt)
findrs = re.compile(r'dark">(.*?)<i class="news-top-list-item-trend')
rs = re.findall(findrs, item)[0].replace("万人", "0000")
data.append(rs)
datalist.append(data)
print(data)
return datalist
def askURL(url):
head = {
"User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36"
}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
#askURL("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26")
url = ("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26")
html=askURL(url)
datalist = getData(url)
print(datalist)
print("爬取完毕!")
输出结果图:
将爬取的数据输入excle
savepath = ".\\夸克热搜排行榜.xls" book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('夸克热搜排行榜',cell_overwrite_ok=True) #创建工作表 col = ("排名","标题","热度") for i in range(0,3): sheet.write(0,i,col[i]) #列名 for i in range(0,100): #测试 print("第%d条" %(i+1)) data = datalist[i] for j in range(0,3): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) print('已输出表格!')
excle输出结果图:
进行数据清洗
1 #导入数据 2 import pandas as pd 3 import numpy as np 4 import seaborn as sns 5 import sklearn 6 #导入数据 7 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')) 8 #显示数据前五行 9 ranking.head() 10 11 #查找重复值 2 ranking.duplicated() 12 13 14 #删除重复值 15 ranking=ranking.drop_duplicates() 16 #输出数据前五行 17 ranking.head()
异常值查询
#导入数据 import pandas as pd import numpy as np import seaborn as sns import sklearn #导入数据 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')) #显示数据前五行 ranking.head() #查找重复值 2 ranking.duplicated() #删除重复值 ranking=ranking.drop_duplicates() #输出数据前五行 ranking.head() ranking.describe()
4.数据分析与可视化
import matplotlib.pyplot as plt import pandas as pd import numpy as np kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls') data=np.array(kuake_df['热度'][0:10]) #索引 index=np.arange(1,11) #用来正常显示中文标签 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示负号 plt.rcParams['axes.unicode_minus']=False #修改x轴字体大小为12 plt.xticks(fontsize=12) #修改y轴字体大小为12 plt.yticks(fontsize=12) print(data) print(index) #x标签 plt.xlabel('排名') #y标签 plt.ylabel('热度') plt.rcParams['font.sans-serif']=['SimHei'] s = pd.Series(data, index) s.plot(kind='bar',color='g') plt.grid() plt.show()
输出结果
5.散点图
#散点图、折线图
kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.rcParams['axes.unicode_minus']=False
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
#散点
plt.scatter(kuake_df.排名, kuake_df.热度,color='b')
#折线
plt.plot(kuake_df.排名, kuake_df.热度,color='r')
#x标签
plt.xlabel('paiming')
#y标签
plt.ylabel('redu')
plt.show()
线性回归方程
from sklearn.linear_model import LinearRegression
zhihu_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
predict_model=LinearRegression()
X=kuake_df[["排名"]]
Y=kuake_df["热度"]
predict_model.fit(X,Y)
print("回归方程系数为{}".format( predict_model.coef_))
print("回归方程截距:{0:2f}".format( predict_model.intercept_))
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import scipy.optimize as opt
kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
x0=np.array(kuake_df['排名'][0:10])
y0=np.array(kuake_df['热度'][0:10])
def func(x,c0):
a,b,c=c0
return a*x**2+b*x+c
def errfc(c0,x,y):
return y-func(x,c0)
c0=[0,2,3]
c1=opt.leastsq(errfc,c0,args=(x0,y0))[0]
a,b,c=c1
print(f"拟合方程为:y={a}*x**2+{b}*x+{c}")
chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.plot(x0,y0,"ob",label="样本数据")
plt.plot(x0,func(x0,c1),"r",label="拟合曲线")
plt.legend(loc=3,prop=chinese)
plt.show()
7、总代码
from bs4 import BeautifulSoup #进行网页解析 import re #进行文字匹配 import urllib.request,urllib.error #制定URL,获取网页数据 import xlwt #进行excel操作 import sqlite3 #进行SQLite数据库操作 def getData(url): datalist = [] html = askURL(url) soup = BeautifulSoup(html,"html.parser") i=1 for item in soup.find_all('a', class_="news-top-list-item c-padding-top-l c-border-bottom c-padding-bottom-l"): data = [] item = str(item) pm = i i=i+1 data.append(pm) #测试print(item) findbt = re.compile(r'</span>(.*?)<span class="news-top-list-item-number') bt = re.findall(findbt, item)[0] data.append(bt) findrs = re.compile(r'dark">(.*?)<i class="news-top-list-item-trend') rs = re.findall(findrs, item)[0].replace("万人", "0000") data.append(rs) datalist.append(data) print(data) return datalist def askURL(url): head = { "User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html #askURL("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") url = ("https://quark.sm.cn/s?from=kkframenew&predict=1&search_id=AAM0gYl%2BOkyU46PzPXUuYxYWwBPQa8ML6I6ZHAjFAA%2Faew%3D%3D_1640440403736&round_id=-1&pdtt=1640440403&uc_param_str=dnntnwvepffrgibijbprsvpidsdichei&q=%E7%83%AD%E6%90%9C%E6%8E%92%E8%A1%8C%E6%A6%9C&hid=72c443e2f1354914d23bba5bb0635f26") html=askURL(url) datalist = getData(url) print(datalist) print("爬取完毕!") savepath = ".\\夸克热搜排行榜.xls" book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('夸克热搜排行榜',cell_overwrite_ok=True) #创建工作表 col = ("排名","标题","热度") for i in range(0,3): sheet.write(0,i,col[i]) #列名 for i in range(0,100): data = datalist[i] for j in range(0,3): sheet.write(i+1,j,data[j]) #数据 book.save(savepath) print('已输出表格!') #导入数据 ranking=pd.DataFrame(pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')) #显示数据前五行 ranking.head() #删除重复值 ranking=ranking.drop_duplicates() #输出数据前五行 ranking.head() ranking.describe() #制作柱形图 kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls') data=np.array(kuake_df['热度'][0:10]) #索引 index=np.arange(1,11) #用来正常显示中文标签 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示负号 plt.rcParams['axes.unicode_minus']=False #修改x轴字体大小为12 plt.xticks(fontsize=12) #修改y轴字体大小为12 plt.yticks(fontsize=12) print(data) print(index) #x标签 plt.xlabel('排名') #y标签 plt.ylabel('热度') plt.rcParams['font.sans-serif']=['SimHei'] s = pd.Series(data, index) s.plot(kind='bar',color='g') plt.grid() plt.show() #散点图、折线图 kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls') plt.rcParams['font.sans-serif']=['Arial Unicode MS'] plt.rcParams['axes.unicode_minus']=False plt.xticks(fontsize=12) plt.yticks(fontsize=12) #散点 plt.scatter(kuake_df.排名, kuake_df.热度,color='b') #折线 plt.plot(kuake_df.排名, kuake_df.热度,color='r') #x标签 plt.xlabel('排名') #y标签 plt.ylabel('热度') plt.rcParams['font.sans-serif']=['SimHei'] plt.show() #回归方程 from sklearn.linear_model import LinearRegression kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls') predict_model=LinearRegression() X=kuake_df[["排名"]] Y=kuake_df["热度"] predict_model.fit(X,Y) print("回归方程系数为{}".format( predict_model.coef_)) print("回归方程截距:{0:2f}".format( predict_model.intercept_)) kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls') x0=np.array(kuake_df['排名'][0:10]) y0=np.array(kuake_df['热度'][0:10]) def func(x,c0): a,b,c=c0 return a*x**2+b*x+c def errfc(c0,x,y): return y-func(x,c0) c0=[0,2,3] c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] a,b,c=c1 print(f"拟合方程为:y={a}*x**2+{b}*x+{c}") chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') plt.plot(x0,y0,"ob",label="样本数据") plt.plot(x0,func(x0,c1),"r",label="拟合曲线") plt.legend(loc=3,prop=chinese) plt.show()
五、总结(10分)
1、经过对夸克热搜的数据分析与可视化,我们可以得到大部分人的兴趣爱好是什么,可以得知人们对什么事情感兴趣,大众的关注点是什么,经过俩天的爬取我发现每一天的热搜排行都有着十分大的变化,可能仅仅几个小时的时间就可能会出来一条上百万的热搜新闻。可以达到预期的目标,观测出人们的兴趣爱好,从而帮助那些因为疫情待在家中无聊的人们寻找一些乐趣,以及一些重要的国家大事
2、在完成此设计过程中,我了解到了网络爬虫的一些重要意义,可以帮助我们获取网站中我们所需的内容。对于爬取还是太过于生疏了,并且还有许多网站不会爬,在未来的日子学习更多的知识去扩大自己的知识面。