我們先來看下原始的網站頁面
如果我們想一個一個復制這些數據,再進行分析,估計要花一天的時間,才可以把明星的各期排行數據處理好。估計會處理到崩潰,還有可能會因為人為原因出錯。
而用爬蟲,半個小時不到就可以處理好這些數據。接下來看看怎么把這些數據用Python爬下來吧。
1男明星人氣榜數據
以下是獲取代碼用到信息的具體步驟:
step1:瀏覽器(一般用火狐和Google我用的360)中打開123粉絲網
step2:按鍵盤F12 -> ctrl+r
step3: 點擊results.php -> 到Headers中找到代碼所需的參數
1 用Python中的Requests庫獲取網頁信息
#爬取當前頁信息,并用BeautifulSoup解析成標準格式importrequests#導入requests模塊importbs4url="https://123fans.cn/lastresults.php?c=1"headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36','RequestMethod':'Get'}req=requests.get(url,timeout=30,headers=headers)soup=bs4.BeautifulSoup(req.text,"html.parser")
代碼解析:
url = :待爬取網頁的url鏈接,相當于指定爬取評論的路徑,本文對應填入上文step3中標注的Requests URL值。
headers = :待爬取網頁的首部信息,把上文step3中標注的Headers中關鍵詞后面的內容對應填入即可。
req =:用get方法獲取待爬網頁的所有信息。
soup:用BeautifulSoup把爬取內容解析成標準格式,方便數據處理。
注1:有些網站訪問時必須帶有瀏覽器等信息,如果不傳入headers就會報錯,所以本例中加入了頭部的一些信息。我試了一下該鏈接不加首部信息也可以正常運行,和加了首部信息得到的結果完全一致。
注2:如果對Requests庫不了解,可以參見本公眾號中文章【Python】【爬蟲】Requests庫詳解
2 把爬取到的數據整合到一個數據框中
#把爬取的數據整合到數據框中importre#正則表達式庫importnumpyasnpimportpandasaspdperiod_data=pd.DataFrame(np.zeros((400,5)))#構造400行5列的全0矩陣備用period_data.columns=['name','popularity_value','period_num','end_time','rank']#給0矩陣列命名#把當期的數據填入表格中#姓名信息i=0name=soup.findAll("td",{"class":"name"})foreachinname:period_data['name'][i]=each.a.text#依次加入姓名i+=1#人氣信息j=0popularity=soup.findAll("td",{"class":"ballot"})foreachinpopularity:period_data['popularity_value'][j]=float(each.text.replace(",",''))#依次加入人氣值j+=1#期數信息period_num=int(re.findall('[0-9]+',str(soup.h3.text))[0])period_data['period_num']=period_num#截止日期end_time_0=str(re.findall('結束日期.+[0-9]+',str(soup.findAll("p",{"class":"results"})))).split('.')end_time=''forstr_1inend_time_0:end_time=end_time+re.findall('[0-9]+',str_1)[0]period_data['end_time']=end_time#有序數,方便截取前多少位period_data_1=period_data.sort_values(by='popularity_value',ascending=False)period_data_1['rank']=range(period_data_1.shape[0])
代碼解析:
period_data:構造400行5列的矩陣用來存放每一期排行數據(前幾期排行榜存放了前341位明星的人氣值,我怕往期的會多一點數據,所以取了400行)。
period_data.columns:給數據加一個列名。
name:用findAll函數取出所有的名字信息。
for each in name:用循環把名字信息存放到period_data中。
popularity:用findAll函數取出所有的人氣值信息。
for each in popularity:用循環把人氣信息存放到period_data中。
period_num:獲取期數信息。
end_time:獲取截止日期。
period_data_1['rank']:在最后一列加入有序數,方便數據截取使用。
接下來展示批量爬蟲代碼
1 定義爬蟲函數
importrequests#導入requests模塊importbs4importre#正則表達式庫importnumpyasnpimportpandasaspdimportwarningsimporttimeimportrandomwarnings.filterwarnings('ignore')#忽視ignore#headers的內容在Headers里面都可以找到headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36','RequestMethod':'Get'}defcrawler(url):req=requests.get(url,timeout=30,headers=headers)#獲取網頁信息soup=bs4.BeautifulSoup(req.text,"html.parser")#用soup庫解析period_data=pd.DataFrame(np.zeros((400,5)))#構造400行5列的全0矩陣備用period_data.columns=['name','popularity_value','period_num','end_time','rank']#給0矩陣列命名#把當期的數據填入表格中#姓名信息i=0name=soup.findAll("td",{"class":"name"})foreachinname:period_data['name'][i]=each.a.text#依次加入姓名i+=1#人氣信息j=0popularity=soup.findAll("td",{"class":"ballot"})foreachinpopularity:period_data['popularity_value'][j]=float(each.text.replace(",",''))#依次加入人氣值j+=1#期數信息period_num=int(re.findall('[0-9]+',str(soup.h3.text))[0])period_data['period_num']=period_num#截止日期end_time_0=str(re.findall('結束日期.+[0-9]+',str(soup.findAll("p",{"class":"results"})))).split('.')end_time=''forstr_1inend_time_0:end_time=end_time+re.findall('[0-9]+',str_1)[0]period_data['end_time']=end_time#有序數,方便截取前多少位period_data_1=period_data.sort_values(by='popularity_value',ascending=False)period_data_1['rank']=range(period_data_1.shape[0])returnperiod_data_1
本段代碼是把分段爬蟲代碼整合到一個函數中,方便反復調用。
2 反復調用函數實現批量爬蟲
period_data_final=pd.DataFrame(np.zeros((1,5)))#構造400行5列的全0矩陣備用period_data_final.columns=['name','popularity_value','period_num','end_time','rank']#給0矩陣列命名forqiinrange(538,499,-1):print("目前爬到了第",qi,'期')ifqi==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:,:]#去掉第一行無用數據
本段代碼是反復調用爬蟲函數獲取頁面數據,并用append整合到一個數據框中。
感謝各位的閱讀!關于“python如何爬取123粉絲網明星數據榜單”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
【資料圖】最近小編看到大家都在討論中國重工業城市有哪些相關的事情,對此呢小編也是非常的感應興趣,那么這件事究竟是怎么發生的呢?具體又是怎么回事呢?下面就是小編搜索到的關于中國重工業城市有哪些事件的相關信息,我們一起來看一下吧!1、遼中南工業基地:含沈陽、撫順、鞍山、本溪、大連等一系列工業城市,該地以鋼鐵、機械、石油化工等重工業為主。2、京津唐工業基地:以北京、天津、唐山為頂點的三角地帶,有鋼鐵、機...
平安行銷支持管理系統是什么?其實就是一個簡單的網上信息查詢的系統,不過很多打中國平安集團的業務員,并不是特別的熟悉,如果你想要擁有更加方便的工作的話,那么就需要登錄到該系統了,在我們登錄系統的時候可以使用自己的平安行銷支持管理系統的賬號和密碼登錄,這個地方需要告訴大家的是,平安行銷支持管理系統,只有業務員才有賬號和密碼,其他人是不能夠登錄的。中國平安保險e行銷何時啟動經營?1、中國平安保險e行銷已...
華西村是怎么富起來的?華西村就是靠走公有制的集體道路,才讓村里的大部分村民都富起來。華西村隸屬于江蘇省江陰市華士鎮,是一個享譽全國、世界知名的村莊。這個村子創造了一個個驚人奇跡,成為共同富裕的典范和中國農村改革的樣本,被譽為“天下第一村”。然而,半個多世紀以前,華西村也是貧困落后的村莊,不僅糧食生產沒有保障,一遇自然災害農民們不是背井離鄉就是家破人亡。如今,華西村是中國最富...