爬取夸克热搜排行榜

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输出结果图:

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(zhihu_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('热度')
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、总代码

  1 from bs4 import BeautifulSoup
  2 #进行网页解析
  3 import re
  4 #进行文字匹配
  5 import urllib.request,urllib.error
  6 #制定URL,获取网页数据
  7 import xlwt
  8 #进行excel操作
  9 import sqlite3
 10 #进行SQLite数据库操作
 11 
 12 
 13     
 14 def getData(url):
 15     datalist = []
 16     html = askURL(url)
 17     soup = BeautifulSoup(html,"html.parser")
 18     i=1
 19     for item in soup.find_all('a', class_="news-top-list-item c-padding-top-l c-border-bottom c-padding-bottom-l"):
 20         data = []
 21         item = str(item)
 22         
 23         #测试print(item)
 24         
 25         pm = i
 26         i=i+1
 27         data.append(pm)
 28         
 29         findbt = re.compile(r'</span>(.*?)<span class="news-top-list-item-number')
 30             # 事件名称
 31         bt = re.findall(findbt, item)[0]
 32         data.append(bt)
 33         findrs = re.compile(r'dark">(.*?)<i class="news-top-list-item-trend')
 34         #热度人数
 35         rs = re.findall(findrs, item)[0].replace("万人", "0000")
 36         data.append(rs)
 37         datalist.append(data)
 38     print(data)
 39     #把处理好的信息放入datalist并返回
 40     return datalist
 41  
 42     #得到指定的一个URL的网页内容
 43 def askURL(url):
 44         #模拟浏览器头部信息
 45     head = {
 46         "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"
 47     }
 48     request = urllib.request.Request(url, headers=head)
 49      #携带着这个包含着我的设备型号的头部信息去访问这个url
 50 
 51     html = ""
 52       #用字符串对它进行存储
 53     try:
 54          #可能会发生的错误,比如说404等
 55         response = urllib.request.urlopen(request)
 56         html = response.read().decode("utf-8")
 57     except urllib.error.URLError as e:
 58         if hasattr(e, "code"):
 59             print(e.code)
 60 
 61         if hasattr(e, "reason"):
 62             print(e.reason)
 63             
 64      #测试 print(html)
 65     return html
 66 
 67 #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")
 68 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")
 69 html=askURL(url)
 70 datalist = getData(url)
 71 print(datalist)
 72 print("爬取完毕!")
 73 savepath = ".\\夸克热搜排行榜.xls"
 74 book = xlwt.Workbook(encoding="utf-8",style_compression=0)
 75     #创建workbook对象
 76 sheet = book.add_sheet('夸克热搜排行榜',cell_overwrite_ok=True)
 77 
 78     #创建工作表
 79 col = ("排名","标题","热度")
 80 
 81 for i in range(0,3):
 82     sheet.write(0,i,col[i]) #列名
 83 
 84 for i in range(0,100):
 85 
 86         #测试 print("第%d条" %(i+1))
 87 
 88     data = datalist[i]
 89     for j in range(0,3):
 90         sheet.write(i+1,j,data[j])
 91             #数据
 92 
 93 book.save(savepath)
 94 
 95 print('已输出表格!')
 96 
 97 
 98 
 99 
100 
101 #柱形图
102 import matplotlib.pyplot as plt
103 
104 import pandas as pd
105 
106 import numpy as np
107 
108 kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
109 data=np.array(kuake_df['热度'][0:10])
110 
111 #索引
112 index=np.arange(1,11)
113 
114 #用来正常显示中文标签
115 plt.rcParams['font.sans-serif']=['Arial Unicode MS']
116 
117 #用来正常显示负号
118 plt.rcParams['axes.unicode_minus']=False 
119 
120 #修改x轴字体大小为12
121 plt.xticks(fontsize=12)
122 
123 #修改y轴字体大小为12
124 plt.yticks(fontsize=12)  
125 print(data)
126 print(index)
127 
128 #x标签 
129 plt.xlabel('排名')
130 
131 #y标签
132 plt.ylabel('热度')
133 s = pd.Series(data, index)
134 s.plot(kind='bar',color='g')
135 plt.grid()
136 plt.show()
137 
138 
139 
140 
141 #散点图、折线图
142 kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
143 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 
144 plt.rcParams['axes.unicode_minus']=False 
145 plt.xticks(fontsize=12)  
146 plt.yticks(fontsize=12)
147 #散点
148 plt.scatter(kuake_df.排名, kuake_df.热度,color='b')
149 #折线
150 plt.plot(kuake_df.排名, kuake_df.热度,color='r')
151 #x标签 
152 plt.xlabel('paiming')
153 #y标签
154 plt.ylabel('redu')
155 plt.show()
156 
157 
158 from sklearn.linear_model import LinearRegression
159 zhihu_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
160 predict_model=LinearRegression()
161 X=kuake_df[["排名"]]
162 Y=kuake_df["热度"]
163 predict_model.fit(X,Y)
164 print("回归方程系数为{}".format( predict_model.coef_)) 
165 print("回归方程截距:{0:2f}".format( predict_model.intercept_))
166 
167 import matplotlib.pyplot as plt
168 import matplotlib
169 import numpy as np
170 import scipy.optimize as opt
171 kuake_df=pd.read_excel(r'C:\Users\86198\夸克热搜排行榜.xls')
172 x0=np.array(kuake_df['排名'][0:10])
173 y0=np.array(kuake_df['热度'][0:10])
174 def func(x,c0):
175     a,b,c=c0
176     return a*x**2+b*x+c
177 def errfc(c0,x,y):
178     return y-func(x,c0)
179 c0=[0,2,3]
180 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0]
181 a,b,c=c1
182 print(f"拟合方程为:y={a}*x**2+{b}*x+{c}")
183 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
184 plt.plot(x0,y0,"ob",label="样本数据")
185 plt.plot(x0,func(x0,c1),"r",label="拟合曲线")
186 plt.legend(loc=3,prop=chinese)
187 plt.show() 

 

五、总结(10分)


1、经过对夸克热搜的数据分析与可视化,我们可以得到大部分人的兴趣爱好是什么,可以得知人们对什么事情感兴趣,大众的关注点是什么,经过俩天的爬取我发现每一天的热搜排行都有着十分大的变化,可能仅仅几个小时的时间就可能会出来一条上百万的热搜新闻。可以达到预期的目标,观测出人们的兴趣爱好,从而帮助那些因为疫情待在家中无聊的人们寻找一些乐趣,以及一些重要的国家大事

2、在完成此设计过程中,我了解到了网络爬虫的一些重要意义,可以帮助我们获取网站中我们所需的内容。对于爬取还是太过于生疏了,并且还有许多网站不会爬,在未来的日子学习更多的知识去扩大自己的知识面

posted @ 2021-12-27 02:30  林痘痘  阅读(1346)  评论(0)    收藏  举报