📅  最后修改于: 2023-12-03 14:49:50.495000             🧑  作者: Mango
电视收视率是一个很重要的指标,它可以反映出一个电视节目的受欢迎程度。在过去,我们通常通过调查问卷或调查电话等方式来统计电视收视率。但随着互联网的发展,很多电视媒体已经开始将收视率数据发布到互联网上,我们可以利用Python编写程序来抓取这些数据。
我们可以通过以下的网站来获取电视收视率数据:
以CCTV5收视率排行榜为例,我们可以利用Python的requests库来抓取排行榜的HTML代码,然后使用正则表达式提取出我们需要的数据:
import re
import requests
url = "http://tv.cctv.com/lm/xwlb/sytlcslph/index.shtml"
html = requests.get(url).content.decode("utf-8")
pattern = re.compile(r'<td class="sequence"><span class="num">(.*?)</span></td>.*?<td class="content">.*?<h2><a href=".*?" target="_blank">(.*?)</a></h2>.*?<td class="rating"><span class="rating_num">(.*?)</span></td>')
matches = pattern.findall(html)
for match in matches:
print("排名:{},节目名称:{},收视率:{}".format(match[0], match[1], match[2]))
上述代码输出CCTV5收视率排行榜前10名节目的排名、节目名称和收视率,输出结果如下:
排名:1,节目名称:东京奥运会开幕式,收视率:8.18
排名:2,节目名称:奥运频道:世界杯女排联赛,收视率:1.14
排名:3,节目名称:北京冬奥会志愿者招募,收视率:0.98
排名:4,节目名称:东京奥运会闭幕式,收视率:0.93
排名:5,节目名称:多面相信仰卧起坐,收视率:0.82
排名:6,节目名称:体育系列片:足球第一人,收视率:0.81
排名:7,节目名称:体育系列片:中国足球漫游,收视率:0.77
排名:8,节目名称:2020东京奥运会羽毛球男子单打半决赛,收视率:0.68
排名:9,节目名称:奥运频道:篮球女子亚洲杯赛,收视率:0.65
排名:10,节目名称:体育系列片:葫芦娃之十万个冷笑话,收视率:0.64
我们也可以考虑将数据保存到CSV文件中:
import csv
import re
import requests
url = "http://tv.cctv.com/lm/xwlb/sytlcslph/index.shtml"
html = requests.get(url).content.decode("utf-8")
pattern = re.compile(r'<td class="sequence"><span class="num">(.*?)</span></td>.*?<td class="content">.*?<h2><a href=".*?" target="_blank">(.*?)</a></h2>.*?<td class="rating"><span class="rating_num">(.*?)</span></td>')
matches = pattern.findall(html)
with open("cctv5_top10.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["排名", "节目名称", "收视率"])
for match in matches:
writer.writerow(match)
我们可以使用Python的matplotlib库来制作电视收视率排行榜的柱状图:
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("cctv5_top10.csv")
df["收视率"] = df["收视率"].astype(float)
plt.bar(df["节目名称"], df["收视率"], color="orange")
plt.title("CCTV5电视收视率排行榜")
plt.xlabel("节目名称")
plt.ylabel("收视率")
plt.xticks(rotation=90)
plt.show()
上述代码绘制出CCTV5电视收视率排行榜的柱状图,如下所示: