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

爬取央视热榜并存储到MongoDB

1. 环境准备

在开始之前,确保你已经安装了以下Python库:

pip install requests pymongo

2. 爬取网页内容

首先,我们需要爬取央视热榜的网页内容。通过requests.get()方法,我们可以获取网页的HTML内容,并通过re.findall()方法来提取我们感兴趣的部分。

import requests
import reheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
url = 'https://tv.cctv.com/top/index.shtml?spm=C28340.PdNvWY0LYxCP.EtmP5mypaGE4.11'
res = requests.get(url, headers=headers)
con = res.content.decode("utf8")

在这一步中,我们访问了央视的热榜页面,并将网页内容解码为UTF-8格式。

3. 解析数据

我们使用正则表达式来提取每个榜单的具体内容。通过re.findall()方法,我们可以从HTML中提取出特定的榜单数据。

datas = re.findall(r'<ul>.*?</ul>', con, re.S)

4. 解析每个榜单的数据

我们将热榜分为几个类别,如热播榜、动画片、电视剧、纪录片和特别节目。分别对每个类别的数据进行解析:

result = {"热播榜": {"name": "热播榜", "items": []},"动画片": {"name": "动画片", "items": []},"电视剧": {"name": "电视剧", "items": []},"纪录片": {"name": "纪录片", "items": []},"特别节目": {"name": "特别节目", "items": []}
}# 热播榜
items = re.findall(r'<li.*?lazy="(.*?)".*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<div class="column"><i class="icon_l"></i><a href=".*?" target="_blank">(.*?)</a>'r'<i class="icon_r"></i></div>.*?</li>',datas[1], re.S)
for item in items:result["热播榜"]["items"].append({"img": item[0],"title": item[1],"category": item[2]})# 动画片
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number"><i class="icon_l">'r'</i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text">'r'<a href=".*?" target="_blank">(.*?)</a></div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>', datas[2], re.S
)
for item in items:result["动画片"]["items"].append({"img": item[0],"title": item[2],"category": item[1],"synopsis": item[3]})# 电视剧
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>',datas[3], re.S
)
for item in items:result["电视剧"]["items"].append({"img": item[0],"title": item[2],"episode": item[1],"synopsis": item[3]})# 纪录片
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i>'r'</span>.*?</div>.*?<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text">'r'<a href=".*?" target="_blank">(.*?)</a></div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>',datas[4], re.S
)
for item in items:result["纪录片"]["items"].append({"img": item[0],"title": item[2],"category": item[1],"synopsis": item[3]})# 特别节目
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>',datas[5], re.S
)
for item in items:result["特别节目"]["items"].append({"img": item[0],"title": item[2],"tv": item[1],"synopsis": item[3]})

在这段代码中,我们通过正则表达式分别提取了每个榜单的数据。每个榜单的数据结构可能略有不同,因此我们为每个榜单编写了相应的解析规则。

数据字段说明:
  • img: 每个节目对应的封面图片链接。
  • title: 节目的标题。
  • category: 节目的种类(如:动画片、电视剧等)。
  • episode: 电视剧的集数(仅电视剧榜单有此字段)。
  • synopsis: 节目的简要介绍。
  • tv: 电视台信息(仅特别节目榜单有此字段)。

5. 存储数据到MongoDB

解析完成后,我们将获取的数据存储到MongoDB中。首先,我们需要连接到MongoDB,然后将解析结果插入到相应的集合中。

import pymongoclient = pymongo.MongoClient()
db = client.get_default_database("cctv")
collection = db.get_collection("top")
collection.insert_one(result)
client.close()

上述代码连接到本地的MongoDB实例,并将数据插入到名为cctv的数据库中的top集合中。最后,关闭数据库连接。

6. 总结

通过以上步骤,我们成功地爬取了央视热榜的数据,并将其存储到MongoDB中。这种方法可以用来定期更新数据,构建自己的数据分析系统,或者为其他应用提供数据支持。

代码:
import reimport pymongo
import requestsheaders = {# 请求工具标识"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) ""Chrome/127.0.0.0 Safari/537.36"
}
url = 'https://tv.cctv.com/top/index.shtml?spm=C28340.PdNvWY0LYxCP.EtmP5mypaGE4.11'
res = requests.get(url, headers=headers)
con = res.content.decode("utf8")
datas = re.findall(r'<ul>.*?</ul>', con, re.S)
result = {"热播榜": {"name": "热播榜","items": []},"动画片": {"name": "动画片","items": []},"电视剧": {"name": "电视剧","items": []},"纪录片": {"name": "纪录片","items": []},"特别节目": {"name": "特别节目","items": []}
}
# print(datas[1])
items = re.findall(r'<li.*?lazy="(.*?)".*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<div class="column"><i class="icon_l"></i><a href=".*?" target="_blank">(.*?)</a>'r'<i class="icon_r"></i></div>.*?</li>',datas[1], re.S)
for item in items:# print(item)result["热播榜"]["items"].append({"img": item[0],"title": item[1],"category": item[2]})# pass
# print(datas[2])
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number"><i class="icon_l">'r'</i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text">'r'<a href=".*?" target="_blank">(.*?)</a></div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>', datas[2], re.S
)
for item in items:# print(item)result["动画片"]["items"].append({"img": item[0],"title": item[2],"category": item[1],"synopsis": item[3]})# pass
# print(datas[3])
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>', datas[3], re.S
)
for item in items:# print(item)result["电视剧"]["items"].append({"img": item[0],"title": item[2],"episode": item[1],"synopsis": item[3]})# pass
# print(datas[4])
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i>'r'</span>.*?</div>.*?<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text">'r'<a href=".*?" target="_blank">(.*?)</a></div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>', datas[4], re.S
)
for item in items:# print(item)result["纪录片"]["items"].append({"img": item[0],"title": item[2],"category": item[1],"synopsis": item[3]})# pass
# print(datas[5])
items = re.findall(r'<li.*?lazy="(.*?)" width="188" height="250"></a>.*?<span class="number">'r'<i class="icon_l"></i><i class="txt">(.*?)</i><i class="icon_r"></i></span>.*?</div>.*?'r'<a class="cover" href=".*?" target="_blank">.*?</a>.*?<div class="text"><a href=".*?" target="_blank">(.*?)</a>'r'</div>.*?<p><a href=".*?" target="_blank">(.*?)</a></p>.*?</li>', datas[5], re.S
)
for item in items:# print(item)result["特别节目"]["items"].append({"img": item[0],"title": item[2],"tv": item[1],"synopsis": item[3]})# pass
# print(result)
client = pymongo.MongoClient()
db = client.get_default_database("cctv")
collection = db.get_collection("top")
collection.insert_one(result)
client.close()
爬取数据:

7. 提示

  • 在实际应用中,如果需要处理大量数据或频繁请求网页,建议添加异常处理和请求延时,以避免对服务器造成过大压力。
  • 如果网页结构发生变化,正则表达式可能需要相应调整。
  • 遵守 robots.txt:在爬取任何网站之前,检查其 robots.txt 文件,确保你的爬虫行为符合网站的爬虫协议。

希望这篇博客对你有所帮助,祝你在数据爬取和存储的学习过程中取得进展!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端宝典十六:深入浅出8大设计模式
  • WIFI驱动开发
  • go中的并发处理
  • LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用
  • 伏图芯片应力仿真功能介绍
  • 如何正确使用 Parallels Desktop 的快照功能
  • 分意图 Prompt 调试、后置判别改写、RLHF 缓解大模型生成可控性
  • Transformer模型:Position Embedding实现
  • GlusterFS-分布式文件系统:概念、案例
  • linux网络问题排查必须要懂的命令
  • 普元EOS-微前端的base基座介绍
  • 【0316】Postgres内核之VACUUM (FULL)运行 portal multi query (11)
  • python——requests
  • 解决Element-plus中Carousel(走马灯)图片无法正常加载的bug
  • react 路由创建与使用
  • avalon2.2的VM生成过程
  • axios 和 cookie 的那些事
  • CSS相对定位
  • egg(89)--egg之redis的发布和订阅
  • laravel 用artisan创建自己的模板
  • Magento 1.x 中文订单打印乱码
  • MobX
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue脚手架vue-cli
  • 京东美团研发面经
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何解决微信端直接跳WAP端
  • 如何使用 JavaScript 解析 URL
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 整理一些计算机基础知识!
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #每天一道面试题# 什么是MySQL的回表查询
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (分布式缓存)Redis哨兵
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (函数)颠倒字符串顺序(C语言)
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (六)DockerCompose安装与配置
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)SvelteKit教程:layout 文件
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)ABI是什么
  • (转)jdk与jre的区别
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作