📜  使用Python抓取电视收视率(1)

📅  最后修改于: 2023-12-03 14:49:50.495000             🧑  作者: Mango

使用Python抓取电视收视率

电视收视率是一个很重要的指标,它可以反映出一个电视节目的受欢迎程度。在过去,我们通常通过调查问卷或调查电话等方式来统计电视收视率。但随着互联网的发展,很多电视媒体已经开始将收视率数据发布到互联网上,我们可以利用Python编写程序来抓取这些数据。

1. 抓取电视收视率数据

我们可以通过以下的网站来获取电视收视率数据:

以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)
2. 数据可视化

我们可以使用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电视收视率排行榜的柱状图,如下所示:

CCTV5电视收视率排行榜