爬取央视网节目单栏目信息!

1、数据爬取

使用工具介绍

使用了python的自动化框架selenium进行动态爬取,Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。 主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。 测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

分析网页

网址:https://tv.cctv.com/

跳转到央视网首页,首先需要下载好,你电脑上已有的浏览器的驱动,我下载的是谷歌浏览器,因此安装的是谷歌的驱动,再通过python的Selenium库的webdriver启动你所安装的谷歌驱动,这样就可以通过央视网网址进入央视网首页

from selenium import webdriver
import requests
import time
#启动谷歌浏览器
browser = webdriver.Chrome('D://百度安装包//chromedriver_win32//chromedriver.exe')
#第一级页面
browser.get('https://tv.cctv.com/')

获取信息

 

进入首页后可以发现需要爬取的央视网节目单信息并不在首页中,需要通过首页中的一个节目单标签跳转到另一个网页页面中,此标签为class=“nav”下的第三个li,然后通过li标签下的a标签中的连接可以跳转的节目单页面中

#在首页中找到央视节目单所在位置(在class为'nav li'的列表中第二个)
input1 = browser.find_elements_by_class_name('nav li')[2]
input2 = input1.find_element_by_css_selector('a')

获得二级信息

 

进入节目单页面后,我们可以通过网页源代码可以看到需要爬取的节目单信息都位于class=“r”下的tr标签下的td标签中,因此可以使用动态爬取节目单信息

#爬取每个频道中有多少个节目
		leng = result.find_element_by_class_name('r')
		leng1 = leng.find_elements_by_css_selector('tr')
		#爬取每个节目的信息(播出时间,节目名,是否播出)
		for i in range(len(leng1)):
			#爬取第i个节目的节目信息
			leng2 = leng.find_elements_by_css_selector('tr')[i]
			input3 = leng2.find_elements_by_css_selector('td')[0]
			input3_1 = leng2.find_elements_by_css_selector('td')[1]
			input3_2 = leng2.find_elements_by_css_selector('td')[2].find_elements_by_css_selector('span')

对央视网频道图片的爬取方法和以上一样

input1_1 = result.find_element_by_class_name('l')
	input1_0 = input1_1.find_elements_by_css_selector('li')
	#爬取央视频道的频道图片
	for s in range(len(input1_0)):
		input1_00 = input1_1.find_elements_by_css_selector('li')[s]
		input1_2 = input1_00.find_element_by_tag_name('img').get_attribute('src')

点击事件

通过以上步骤,能够找到第一个节目频道的所有节目信息,而在这个网页中我们无法找到其他频道的节目信息,因此我们需要使用点击事件,通过点击下一个频道,来使我们爬取到所有的节目单信息。

leng0 = result.find_elements_by_css_selector('li')[j].click()
	#设置点击后休眠0.5秒
	time.sleep(0.5)

2、数据存储

本文中介绍了两种存储的方法:一种对图片的存储;一种对文字信息的存储

对文字信息的存储

#写入txt文件
				with open("YS_cctv.txt","a+",encoding='utf-8') as f:
					f.write("时间:")
					f.write(input3.text)
					f.write("节目:")
					f.write(input3_1.text)
					f.write(input3_3_2.text)
					f.write(input3_3_1.text)
					f.write('\n')
					print("时间:",input3.text,"节目:",input3_1.text,input3_3_2.text,input3_3_1.text)
			else:
				input3_3_1 = input3_2[0]
				with open("YS_cctv.txt","a+",encoding='utf-8') as f:
					f.write("时间:")
					f.write(input3.text)
					f.write("节目:")
					f.write(input3_1.text)
					f.write(input3_3_1.text)
					f.write('\n')
					print("时间:",input3.text,"节目:",input3_1.text,input3_3_1.text)

对图片的存储

name=str(s+1)+'.jpg'
		erwer=requests.get(input1_2).content
		#将图片写入文件夹中
		with open("YS_cctv/"+name,"wb") as f:
			f.write(erwer)

3、完整爬取代码

from selenium import webdriver
import requests
import time
#启动谷歌浏览器
browser = webdriver.Chrome('D://百度安装包//chromedriver_win32//chromedriver.exe')
#第一级页面
browser.get('https://tv.cctv.com/')
#在首页中找到央视节目单所在位置(在class为'nav li'的列表中第二个)
input1 = browser.find_elements_by_class_name('nav li')[2]
input2 = input1.find_element_by_css_selector('a')
browser2 = webdriver.Chrome('D://百度安装包//chromedriver_win32//chromedriver.exe')
#通过刚找到的节目单位置找到进入节目单板块的链接,进入第二个页面
browser2.get(input2.get_attribute('href'))
result= browser2.find_element_by_class_name('channel_con')
#找到有li标签,从而找到频道有多少个
leng3 = result.find_elements_by_css_selector('li')
#爬取所有频道的节目单
for j in range(len(leng3)):
	leng0 = result.find_elements_by_css_selector('li')[j].click()
	#设置点击后休眠0.5秒
	time.sleep(0.5)
	#爬取央视网节目单
	def cctv_program():
		#爬取每个频道中有多少个节目
		leng = result.find_element_by_class_name('r')
		leng1 = leng.find_elements_by_css_selector('tr')
		#爬取每个节目的信息(播出时间,节目名,是否播出)
		for i in range(len(leng1)):
			#爬取第i个节目的节目信息
			leng2 = leng.find_elements_by_css_selector('tr')[i]
			input3 = leng2.find_elements_by_css_selector('td')[0]
			input3_1 = leng2.find_elements_by_css_selector('td')[1]
			input3_2 = leng2.find_elements_by_css_selector('td')[2].find_elements_by_css_selector('span')
			#判断每个节目的第三个信息有几个(只有一个则只爬取一条信息,否则都爬出来)
			if len(input3_2) != 1:
				input3_3_1 = input3_2[0]
				input3_3_2 = input3_2[1]
				#写入txt文件
				with open("YS_cctv.txt","a+",encoding='utf-8') as f:
					f.write("时间:")
					f.write(input3.text)
					f.write("节目:")
					f.write(input3_1.text)
					f.write(input3_3_2.text)
					f.write(input3_3_1.text)
					f.write('\n')
					print("时间:",input3.text,"节目:",input3_1.text,input3_3_2.text,input3_3_1.text)
			else:
				input3_3_1 = input3_2[0]
				with open("YS_cctv.txt","a+",encoding='utf-8') as f:
					f.write("时间:")
					f.write(input3.text)
					f.write("节目:")
					f.write(input3_1.text)
					f.write(input3_3_1.text)
					f.write('\n')
					print("时间:",input3.text,"节目:",input3_1.text,input3_3_1.text)
		print("----------------------------------------------------------------------")
	cctv_program()
#爬取央视网频道图片
def cctv_picture():
	input1_1 = result.find_element_by_class_name('l')
	input1_0 = input1_1.find_elements_by_css_selector('li')
	#爬取央视频道的频道图片
	for s in range(len(input1_0)):
		input1_00 = input1_1.find_elements_by_css_selector('li')[s]
		input1_2 = input1_00.find_element_by_tag_name('img').get_attribute('src')
		name=str(s+1)+'.jpg'
		erwer=requests.get(input1_2).content
		#将图片写入文件夹中
		with open("YS_cctv/"+name,"wb") as f:
			f.write(erwer)
cctv_picture()
browser.close()
browser2.close()

存储截图:

 

4、数据可视化分析

对数据的可视化分析需要用到csv文件,因此我们需要把写入文件的方式从txt改为csv。代码如下:

with open("YS_cctv.csv","a+",newline="") as f:
					writer = csv.writer(f)
					writer.writerow([input3.text,input3_1.text,input3_3_1.text,input3_3_2.text])

保存到csv文件的信息如下:

 

时间段-播出节目量

为探究不同时间段央视网节目播出量的多少,我们可以将时间化为’0-2’,‘2-4’,‘4-6’,‘6-8’,‘8-10’,‘10-12’,‘12-14’,‘14-16’,‘16-18’,‘18-20’,‘20-22’,'22-0’十二个时间段来进行分析

df=pd.read_csv(r'D:/python 文件/YS_cctv.csv',encoding='gbk')
#时间在00:00 到2:00播出节目总数
a=len(df[(df['时间'] >='00:00' ) & (df['时间'] <='02:00')])
#时间在2:00 到4:00播出节目总数
b=len(df[(df['时间'] >'02:00' ) & (df['时间'] <='04:00')])
#时间在4:00 到6:00播出节目总数
c=len(df[(df['时间'] >'04:00' ) & (df['时间'] <='06:00')])
#时间在6:00 到8:00播出节目总数
d=len(df[(df['时间'] >='06:00' ) & (df['时间'] <='08:00')])
#时间在8:00 到10:00播出节目总数
e=len(df[(df['时间'] >'08:00' ) & (df['时间'] <='10:00')])
#时间在10:00 到12:00播出节目总数
f=len(df[(df['时间'] >'10:00' ) & (df['时间'] <='12:00')])
#时间在12:00 到14:00播出节目总数
g=len(df[(df['时间'] >='12:00' ) & (df['时间'] <='14:00')])
#时间在14:00 到16:00播出节目总数
h=len(df[(df['时间'] >'14:00' ) & (df['时间'] <='16:00')])
#时间在16:00 到18:00播出节目总数
i=len(df[(df['时间'] >'16:00' ) & (df['时间'] <='18:00')])
#时间在18:00 到20:00播出节目总数
j=len(df[(df['时间'] >='18:00' ) & (df['时间'] <='20:00')])
#时间在20:00 到22:00播出节目总数
k=len(df[(df['时间'] >'20:00' ) & (df['时间'] <='22:00')])
#时间在22:00 到23:59播出节目总数
l=len(df[(df['时间'] >'22:00' ) & (df['时间'] <='23:59')])
labels ='0-2','2-4','4-6','6-8','8-10','10-12','12-14','14-16','16-18','18-20','20-22','22-0'  # 标签
sizes = [a,b,c,d,e,f,g,h,i,j,k,l]  # 每块区域的大小所占比例
#plt.pie()表示绘制饼图
# sizes必须是第一个参数, autopct='%1.1f%%'表明区域比例精度为0.1%
# startangle=0表示A区域在左上方,startangle=90表示A区域在右上方
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.show()

使用matplotlib库进行可视化: 饼状图:

条形图:

#条形图
plt.bar(['0-2','2-4','4-6','6-8','8-10','10-12','12-14','14-16','16-18','18-20','20-22','22-0'],[a,b,c,d,e,f,g,h,i,j,k,l])
plt.legend()
plt.xlabel('时间段')
plt.ylabel('播出节目量')
plt.title('时间段-播出节目量')
plt.show()

 

折线图:

plt.plot(x_data,y_data)#折线图
plt.show()

 

 

播出方式-播出节目量

探究节目正在播出方式的不同种类的央视网节目播出量,我们可以通过看播出方式是否是回看、直播中和未开始三个方面来进行分析,其中中文无法显示,解决方法是采用动态配置的方法

plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False #负号显示

其中最后一行用于解决更改成中文字体后负号无法正常显示的问题。

df=pd.read_csv(r'D:/python 文件/YS_cctv.csv',encoding='gbk')
#播出方式为直播中的播出节目总数
a=len(df[(df['是否播出'] =='直播中')])
#播出方式为未开始的播出节目总数
b=len(df[(df['是否播出'] =='未开始')])
#播出方式为回看的播出节目总数
c=len(df[(df['是否播出'] =='回看')])
labels ='直播中','未开始', '回看'  # 标签
sizes = [a,b,c]  # 每块区域的大小所占比例
# 第一个参数为0.1,表明A区域与饼图分离的距离为0.1
explode = (0.1, 0, 0)
#plt.pie()表示绘制饼图
# sizes必须是第一个参数, autopct='%1.1f%%'表明区域比例精度为0.1%
# startangle=0表示A区域在左上方,startangle=90表示A区域在右上方
plt.pie(sizes, labels=labels,explode=explode,autopct='%1.1f%%', startangle=0)
plt.show()

使用matplotlib库进行可视化: 饼状图:

条形图:

plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False #负号显示
df=pd.read_csv(r'D:/python 文件/YS_cctv.csv',encoding='gbk')
#播出方式为直播中的播出节目总数
a=len(df[(df['是否播出'] =='直播中')])
#播出方式为未开始的播出节目总数
b=len(df[(df['是否播出'] =='未开始')])
#播出方式为回看的播出节目总数
c=len(df[(df['是否播出'] =='回看')])
plt.bar(['直播中','未开始', '回看'],[a,b,c])
plt.legend()
plt.xlabel('播出方式')
plt.ylabel('播出节目量')
plt.title('播出方式-播出节目量')
plt.show()

 

折线图:

通过词云将关键词整合出来

以上就是关于央视网节目单信息的全部内容,如果对内容感兴趣,欢迎在下方评论点赞,您的支持是对作者最大的动力,如果觉得本文中有不足欢迎大家指点出来,后续可能会添加更多新内容!

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值