当前位置: 首页>Python>正文

爬蟲爬取網站之家,【Python爬蟲】用Python爬取娛樂圈排行榜數據

爬蟲爬取網站之家,【Python爬蟲】用Python爬取娛樂圈排行榜數據

??想關注你的愛豆最近在娛樂圈發展的怎么樣嗎?本文和你一起爬取娛樂圈的排行榜數據,來看看你的愛豆現在排名變化情況,有幾次登頂,幾次進了前十名呀。

PS:在下一篇文章中分析排行榜的動態變化趨勢,并繪制成動態條形圖和折線圖。

??

一、網站原始信息

爬蟲爬取網站之家,??
我們先來看下原始的網站頁面

在這里插入圖片描述

??如果我們想一個一個復制這些數據,再進行分析,估計要花一天的時間,才可以把明星的各期排行數據處理好。估計會處理到崩潰,還有可能會因為人為原因出錯。

??而用爬蟲,半個小時不到就可以處理好這些數據。接下來看看怎么把這些數據用Python爬下來吧。

爬蟲爬取數據,??

二、先來看下爬取后數據的部分截圖

??

1 男明星人氣榜數據

在這里插入圖片描述

2 女明星人氣榜數據

在這里插入圖片描述

爬蟲能做什么。??

三、如何獲取123粉絲網的爬蟲信息

??
以下是獲取代碼用到信息的具體步驟:

step1:瀏覽器(一般用火狐和Google我用的360)中打開123粉絲網

step2:按鍵盤F12 -> ctrl+r

娛樂男明星人氣排行榜投票。step3: 點擊results.php -> 到Headers中找到代碼所需的參數

在這里插入圖片描述
??

四、分步爬蟲代碼解析

??

1 用Python中的Requests庫獲取網頁信息
#爬取當前頁信息,并用BeautifulSoup解析成標準格式
import requests  #導入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 = :待爬取網頁的url鏈接,相當于指定爬取評論的路徑,本文對應填入上文step3中標注的Requests URL值。

headers = :待爬取網頁的首部信息,把上文step3中標注的Headers中關鍵詞后面的內容對應填入即可。

req =:用get方法獲取待爬網頁的所有信息。

soup:用BeautifulSoup把爬取內容解析成標準格式,方便數據處理。

明星人氣榜、注1:有些網站訪問時必須帶有瀏覽器等信息,如果不傳入headers就會報錯,所以本例中加入了頭部的一些信息。我試了一下該鏈接不加首部信息也可以正常運行,和加了首部信息得到的結果完全一致。

注2:如果對Requests庫不了解,可以參見本公眾號中文章【Python】【爬蟲】Requests庫詳解

??

2 把爬取到的數據整合到一個數據框中
#把爬取的數據整合到數據框中
import re                #正則表達式庫
import numpy as np   
import pandas as pd
?
period_data = pd.DataFrame(np.zeros((400,5)))  #構造400行5列的全0矩陣備用
period_data.columns = ['name', 'popularity_value', 'period_num', 'end_time','rank']  #給0矩陣列命名
#把當期的數據填入表格中
#姓名信息
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
#期數信息
period_num = int(re.findall('[0-9]+', str(soup.h2.text))[0])
period_data['period_num'] = period_num
#截止日期
end_time_0 = str(re.findall('結束日期.+[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
#有序數,方便截取前多少位
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 定義爬蟲函數
import requests  #導入requests模塊
import bs4
import re        #正則表達式庫
import numpy as np   
import pandas as pd
import warnings
import time
import random
?
warnings.filterwarnings('ignore')  #忽視ignore
#headers的內容在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)  # 獲取網頁信息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 = 0 name = soup.findAll("td", {"class":"name"})for each in name:period_data['name'][i]=each.a.text  #依次加入姓名i += 1#人氣信息j = 0popularity = soup.findAll("td", {"class":"ballot"})for each in popularity:period_data['popularity_value'][j]=float(each.text.replace(",",''))  #依次加入人氣值j += 1#期數信息period_num = int(re.findall('[0-9]+', str(soup.h2.text))[0])period_data['period_num'] = period_num#截止日期end_time_0 = str(re.findall('結束日期.+[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#有序數,方便截取前多少位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

本段代碼是把分段爬蟲代碼整合到一個函數中,方便反復調用。

??

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矩陣列命名
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:,:] #去掉第一行無用數據

本段代碼是反復調用爬蟲函數獲取頁面數據,并用append整合到一個數據框中。

注1: print是為了展示爬取到第幾期了。
注2:url中用了.format是為了控制跳轉頁面。
注3:time.sleep中用了隨機數,是人為休眠一段不定長時間為了防止反爬蟲。

??本文是本人使用Python庫進行爬蟲的非商業行為,如有問題,請指正。如果想獲取文中所有可直接執行的代碼和數據,可在公眾號中回復"爬取娛樂圈排行榜數據",即可免費獲取。如對代碼有疑問,可以到公眾號中私信我。

你可能感興趣:
孤立森林
風控建模整體流程
用Python繪制皮卡丘
用Python繪制詞云圖
Python入門干貨經驗(免費提供資料)
用Python繪制楊紫作品集動態二維碼
【Python】【爬蟲】Requests庫詳解

長按(掃一掃)識別上方二維碼學習更多Python和建模知識

https://www.nshth.com/python/338560.html
>

相关文章:

  • 爬蟲爬取網站之家
  • 爬蟲爬取數據
  • 爬蟲能做什么
  • 娛樂男明星人氣排行榜投票
  • 娛樂圈明星
  • 明星人氣榜
  • 爬蟲爬
  • 爬取
  • 國二python難嗎,python字符串(二)
  • 電腦軟件下載app,在電腦上體驗了 16 款手機 App 后,我很失望
  • elasticsearch中文文檔,Elastic安全分析新利器 —— Event Query Language (EQL) 介紹
  • 數據結構與算法python,[FreeCodeCamp筆記] Python 數據結構和算法1 二分搜索 Binary Search
  • 黑蘋果macOS系統鏡像工具,MacOS Monterey 12.2.1 (21D62) OC 0.7.8 / Cl 5144 / PE 三分區原版黑蘋果鏡像
  • 51單片機畢業設計論文,【畢業設計】基于單片機無線充電的4軸飛行器 -物聯網 嵌入式 stm32
  • 數據庫基礎知識整理,數據庫筆記整理
  • python運行不報錯又無任何結果輸出,linux 正確錯誤輸出_報告錯誤的正確方法
  • 計算機組成原理第六版課后答案,杭電計算機組成原理實驗九R-I,杭電計組實驗9-實現R-I型指令的CPU設計實驗.doc
  • python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用
  • 數據庫視圖是什么,【SpringMVC】SpringMVC模型數據+視圖解析器
  • mp3格式轉換器,FFmpeg支持的音頻和視頻編解碼格式
  • 音樂學校招生要求,學校的音樂樓
  • c語言輸入兩個數輸出較大數,C語言求兩個數的較大值
  • 定義一個函數求三個數的最大值,輸入兩個整數,要求輸出其中值較大者。要求用函數求出最大值
  • MySQL學習 DAY1
  • 一個眼神一個微笑就讓人滿足,看得到的微笑
  • centos7安裝MySQL,centos7下載spark連接mysql數據庫提取數據(pyspark,Scala,python獨立執行)
  • node.js開發,從零開始nodejs系列文章-nodejs到底能干什么
  • python控制軟件自動化,Python實現網站自動登錄---傻瓜教程
  • get all of,resent = msg.get_all('Resent-Date') AttributeError: 'str' object h
  • opencv人體動作識別,torchvision使用keypoint rcnn 進行人體關鍵點定位
  • 深度卷積神經網絡原理與實踐,卷積神經網絡resent網絡實踐
  • 服務器,win服務器系統路由器,Windows server 2012 之路由功能
  • 小青蛙走迷宮的問題
  • 漢諾塔-小青蛙
  • 小青蛙oracle跟蹤,在小青蛙TOAD中用oracle語句寫
  • 音頻頻譜分析儀安卓版,[Android]自定義繪制一個簡易的音頻條形圖,附上對MP3音頻波形數據的采集與展現
  • 連乘符號∏的運算法則,∏這個是什么符號?
  • 用例失敗jenkins卻構建成功,jenkins 構建異常_jenkins構建失敗的原因是什么?