您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)python如何爬取123粉絲網(wǎng)明星數(shù)據(jù)榜單的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
我們先來(lái)看下原始的網(wǎng)站頁(yè)面
如果我們想一個(gè)一個(gè)復(fù)制這些數(shù)據(jù),再進(jìn)行分析,估計(jì)要花一天的時(shí)間,才可以把明星的各期排行數(shù)據(jù)處理好。估計(jì)會(huì)處理到崩潰,還有可能會(huì)因?yàn)槿藶樵虺鲥e(cuò)。
而用爬蟲,半個(gè)小時(shí)不到就可以處理好這些數(shù)據(jù)。接下來(lái)看看怎么把這些數(shù)據(jù)用Python爬下來(lái)吧。
1 男明星人氣榜數(shù)據(jù)
以下是獲取代碼用到信息的具體步驟:
step1:瀏覽器(一般用火狐和Google我用的360)中打開(kāi)123粉絲網(wǎng)
step2:按鍵盤F12 -> ctrl+r
step3: 點(diǎn)擊results.php -> 到Headers中找到代碼所需的參數(shù)
1 用Python中的Requests庫(kù)獲取網(wǎng)頁(yè)信息
#爬取當(dāng)前頁(yè)信息,并用BeautifulSoup解析成標(biāo)準(zhǔn)格式 import requests #導(dǎo)入requests模塊 import bs4 url = "https://123fans.cn/lastresults.php?c=1" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 'Request Method':'Get'} req = requests.get(url, timeout=30, headers=headers) soup = bs4.BeautifulSoup(req.text, "html.parser")
代碼解析:
url = :待爬取網(wǎng)頁(yè)的url鏈接,相當(dāng)于指定爬取評(píng)論的路徑,本文對(duì)應(yīng)填入上文step3中標(biāo)注的Requests URL值。
headers = :待爬取網(wǎng)頁(yè)的首部信息,把上文step3中標(biāo)注的Headers中關(guān)鍵詞后面的內(nèi)容對(duì)應(yīng)填入即可。
req =:用get方法獲取待爬網(wǎng)頁(yè)的所有信息。
soup:用BeautifulSoup把爬取內(nèi)容解析成標(biāo)準(zhǔn)格式,方便數(shù)據(jù)處理。
注1:有些網(wǎng)站訪問(wèn)時(shí)必須帶有瀏覽器等信息,如果不傳入headers就會(huì)報(bào)錯(cuò),所以本例中加入了頭部的一些信息。我試了一下該鏈接不加首部信息也可以正常運(yùn)行,和加了首部信息得到的結(jié)果完全一致。
注2:如果對(duì)Requests庫(kù)不了解,可以參見(jiàn)本公眾號(hào)中文章【Python】【爬蟲】Requests庫(kù)詳解
2 把爬取到的數(shù)據(jù)整合到一個(gè)數(shù)據(jù)框中
#把爬取的數(shù)據(jù)整合到數(shù)據(jù)框中 import re #正則表達(dá)式庫(kù) import numpy as np import pandas as pd period_data = pd.DataFrame(np.zeros((400,5))) #構(gòu)造400行5列的全0矩陣備用 period_data.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #給0矩陣列命名 #把當(dāng)期的數(shù)據(jù)填入表格中 #姓名信息 i = 0 name = soup.findAll("td", {"class":"name"}) for each in name: period_data['name'][i]=each.a.text #依次加入姓名 i += 1 #人氣信息 j = 0 popularity = soup.findAll("td", {"class":"ballot"}) for each in popularity: period_data['popularity_value'][j]=float(each.text.replace(",",'')) #依次加入人氣值 j += 1 #期數(shù)信息 period_num = int(re.findall('[0-9]+', str(soup.h3.text))[0]) period_data['period_num'] = period_num #截止日期 end_time_0 = str(re.findall('結(jié)束日期.+[0-9]+', str(soup.findAll("div", {"class":"results"})))).split('.') end_time = '' for str_1 in end_time_0: end_time = end_time + re.findall('[0-9]+',str_1)[0] period_data['end_time'] = end_time #有序數(shù),方便截取前多少位 period_data_1 = period_data.sort_values(by='popularity_value',ascending=False) period_data_1['rank'] = range(period_data_1.shape[0])
代碼解析:
period_data:構(gòu)造400行5列的矩陣用來(lái)存放每一期排行數(shù)據(jù)(前幾期排行榜存放了前341位明星的人氣值,我怕往期的會(huì)多一點(diǎn)數(shù)據(jù),所以取了400行)。
period_data.columns:給數(shù)據(jù)加一個(gè)列名。
name:用findAll函數(shù)取出所有的名字信息。
for each in name:用循環(huán)把名字信息存放到period_data中。
popularity:用findAll函數(shù)取出所有的人氣值信息。
for each in popularity:用循環(huán)把人氣信息存放到period_data中。
period_num:獲取期數(shù)信息。
end_time:獲取截止日期。
period_data_1['rank']:在最后一列加入有序數(shù),方便數(shù)據(jù)截取使用。
接下來(lái)展示批量爬蟲代碼
1 定義爬蟲函數(shù)
import requests #導(dǎo)入requests模塊 import bs4 import re #正則表達(dá)式庫(kù) import numpy as np import pandas as pd import warnings import time import random warnings.filterwarnings('ignore') #忽視ignore #headers的內(nèi)容在Headers里面都可以找到 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 'Request Method':'Get'} def crawler(url): req = requests.get(url, timeout=30, headers=headers) # 獲取網(wǎng)頁(yè)信息 soup = bs4.BeautifulSoup(req.text, "html.parser") #用soup庫(kù)解析 period_data = pd.DataFrame(np.zeros((400,5))) #構(gòu)造400行5列的全0矩陣備用 period_data.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #給0矩陣列命名 #把當(dāng)期的數(shù)據(jù)填入表格中 #姓名信息 i = 0 name = soup.findAll("td", {"class":"name"}) for each in name: period_data['name'][i]=each.a.text #依次加入姓名 i += 1 #人氣信息 j = 0 popularity = soup.findAll("td", {"class":"ballot"}) for each in popularity: period_data['popularity_value'][j]=float(each.text.replace(",",'')) #依次加入人氣值 j += 1 #期數(shù)信息 period_num = int(re.findall('[0-9]+', str(soup.h3.text))[0]) period_data['period_num'] = period_num #截止日期 end_time_0 = str(re.findall('結(jié)束日期.+[0-9]+', str(soup.findAll("div", {"class":"results"})))).split('.') end_time = '' for str_1 in end_time_0: end_time = end_time + re.findall('[0-9]+',str_1)[0] period_data['end_time'] = end_time #有序數(shù),方便截取前多少位 period_data_1 = period_data.sort_values(by='popularity_value',ascending=False) period_data_1['rank'] = range(period_data_1.shape[0]) return period_data_1
本段代碼是把分段爬蟲代碼整合到一個(gè)函數(shù)中,方便反復(fù)調(diào)用。
2 反復(fù)調(diào)用函數(shù)實(shí)現(xiàn)批量爬蟲
period_data_final = pd.DataFrame(np.zeros((1,5))) #構(gòu)造400行5列的全0矩陣備用 period_data_final.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank'] #給0矩陣列命名 for qi in range(538,499,-1): print("目前爬到了第",qi,'期') if qi == 538: url="https://123fans.cn/lastresults.php?c=1" else: url="https://123fans.cn/results.php?qi={}&c=1".format(qi) time.sleep(random.uniform(1, 2)) date = crawler(url) period_data_final = period_data_final.append(date) period_data_final_1 = period_data_fina.loc[1:,:] #去掉第一行無(wú)用數(shù)據(jù)
本段代碼是反復(fù)調(diào)用爬蟲函數(shù)獲取頁(yè)面數(shù)據(jù),并用append整合到一個(gè)數(shù)據(jù)框中。
感謝各位的閱讀!關(guān)于“python如何爬取123粉絲網(wǎng)明星數(shù)據(jù)榜單”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。