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、在完成此設計過程中,我了解到了網絡爬蟲的一些重要意義,可以幫助我們獲取網站中我們所需的內容。對於爬取還是太過於生疏了,並且還有許多網站不會爬,在未來的日子學習更多的知識去擴大自己的知識面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM