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

posted @ 2021-12-27 21:33  林痘痘  阅读(1849)  评论(1编辑  收藏  举报