爬取央视网节目单栏目信息!
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学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地
爬取央视网节目单栏目信息!相关推荐
- 爬取央视网节目单栏目信息
1.数据爬取 使用工具介绍 使用了python的自动化框架selenium进行动态爬取,Selenium是一个用于Web应用程序自动化测试工具.Selenium测试直接运行在浏览器中,就像真正的用户在 ...
- python爬虫爬取当当网的商品信息
python爬虫爬取当当网的商品信息 一.环境搭建 二.简介 三.当当网网页分析 1.分析网页的url规律 2.解析网页html页面 书籍商品html页面解析 其他商品html页面解析 四.代码实现 ...
- BeautifulSoup爬取贝壳网成都二手房源信息(附:完整源代码)
BeautifulSoup爬取贝壳网成都二手房源信息 最近想出一套二手房,刚好在学习爬虫,那就顺手爬一下贝壳上成都各区二手房信息了解一下行情,本篇先介绍数据爬取,数据分析稍后有时间再写.仅用于技术交流 ...
- Scrapy爬取当当网的商品信息存到MySQL数据库
Scrapy爬取当当网的商品信息存到MySQL数据库 Scrapy 是一款十分强大的爬虫框架,能够快速简单地爬取网页,存到你想要的位置.经过两天的摸索,终于搞定了一个小任务,将当当网的商品信息爬下来存 ...
- python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息
python爬虫--使用selenium爬取知网文献相关信息 写在前面: 本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器 如侵权联系作者删除 文中的错误已经修改过来了,谢谢各位爬友指出错误 ...
- python爬取当当网的书籍信息并保存到csv文件
python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...
- 如何爬取当当网畅销书排行榜信息? requests + pyquery
''' 爬取当当网的五星图书排行榜的信息 ''' Max_Page = 3 # 爬取前三页的排行榜信息 import requests from pyquery import PyQuery as p ...
- 珍爱网html模板,爬取珍爱网后用户信息展示
golang爬取珍爱网,爬到了3万多用户信息,并存到了elasticsearch中,如下图,查询到了3万多用户信息. image.png 先来看看最终效果: 42.gif 利用到了go语言的html模 ...
- [Python]scrapy爬取当当网书籍相关信息
最近想买两本程序设计的书籍,也就在当当网上面看了下,发现真是太多的书了.所以想着利用爬虫知识爬取下程序设计相关书籍的一些信息. 00_1. 首先是今天所用到的东西 python 3.5 + scrap ...
最新文章
- Windows Server 2003 R2實現域內共享打印機智能部署
- android 颜色值参考,(有颜色图
- Bluetooth ATT介绍
- PHP JSON 操作总结
- C++union 联合
- ssm提交post_我用spring mvc做,用post方式提交,后台获取不到参数值,用get方式就可以,什么问题...
- Java SSM篇3——Mybatis
- 叫醒你的是闹钟,还是梦想?
- 获取文件夹下所有文件名(window+linux)
- 如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求
- 宗成庆《自然语言理解》第三章作业
- Win10蓝牙驱动程序错误怎么回事?
- cad批量打印快捷键_批量打印CAD图(无删减版)
- Java可以加速播放的播放器,基于live555的rtsp播放器之十二:使用soundtouch加速音频播放...
- 小程序纵向选项卡可以滑动_微信小程序实现选项卡滑动切换
- xp关闭计算机共享,关闭Windows XP系统默认共享四种方法
- 三角函数常用公式总结
- 缠论-2011.4.11晚
- 数学建模-对策论模型
- 前端开发_HTML5_CSS部分-背景(background)
热门文章
- 最容易的编译webrtc方案
- 什么时候会出现user_objects的invalid_月季什么时候冬剪合适?记住不能剪得太早,不然会出现这种现象...
- OBS(open build service)入门
- 如何策划出优质的软文内容?
- 2021-10-01leetcode840.矩阵中的幻方
- 蜂鸟E203学习笔记(四)——取指
- fabric运维监控:prometheus配置热更新
- 2021校赛基于stm32f103多功能台灯
- 有谁知道pos机刷卡费率多少?
- java中的输入scanner_java中如何输入一个数,用scanner语句