基于Python+MongoDB猫眼电影 Top100 数据爬取与存储

前言:从猫眼电影排行榜页面(TOP100榜 - 猫眼电影 - 一网打尽好电影 )爬取 Top100 电影的电影名称、图片地址、主演、上映时间和评分等关键信息,并将这些信息存储到本地 MongoDB 数据库中,🔗 相关链接Xpath,可视化🔥🔥🔥


❤ 【作者主页—📚优质文章、获取更多优质源码】


目录

一. 准备工作

二. 编写函数 

2.1 连接MongoDB数据库

2.2 数据爬取

三. 运行结果

四. 更多干货


一. 准备工作

我们在编写python代码前,首先要导入用到的一些库 ,如果没有BeautifulSoup,就在终端输入pip install BeautifulSoup下载即可

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
import re
import time
import random

二. 编写函数 

def自定义函数名scrape_maoyan_top100,然后定义url网址,设置请求头

def scrape_maoyan_top100():url = "https://www.maoyan.com/board/4"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36','Referer': 'https://www.maoyan.com/','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive'}

为了提高代码健壮性,使用try函数作异常处理,time.sleep()保障每次请求之间的随机延迟,通过避免短时间内频繁发送请求,保证数据爬取过程的稳定性和可持续性,接着发送get请求检验响应的状态码,使用utf-8解码,并将获取到的 HTML 内容赋值给html变量,保存为maoyan.html,然后BeautifulSoup解析 html 

    try:time.sleep(random.uniform(1, 3))response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()response.encoding = 'utf-8'html = response.textwith open('maoyan.html', 'w', encoding='utf-8') as f:f.write(html)soup = BeautifulSoup(html, 'html.parser')

2.1 连接MongoDB数据库

使用MongoClient('mongodb://localhost:27017/')接到本地运行的 MongoDB 服务器,获取本地连接中的数据库对象maoyan和集合对象top_movies,在插入数据之前,先清空集合中的原有数据,以保证每次运行代码存储的都是最新数据

        client = MongoClient('mongodb://localhost:27017/')db = client['maoyan']collection = db['top_movies']collection.delete_many({})

2.2 数据爬取

首先我们要分析该网页的html结构,如下图所示,所有的电影信息被包裹在一个 class 为 board-wrapper 的元素中,该元素起到了一个容器的作用

如下图所示,第一个<dd>标签包含第一部电影的所有信息,我们可以看到下方黄色的边框里的每一个并列的<dd>标签,就可以推断出每部电影的信息都以<dd>标签为单位进行包裹

根据以上两幅图片,我们可以总结出该网站的缩略html结构(仅包含电影信息)如下

    <dl class="board-wrapper><dd>第一部电影的信息 </dd><dd>第二部电影的信息 </dd></dl>

分析完网页结构后,接着写soup.select🔍('.board-wrapper dd') 就会选择到 <dl class="board-wrapper"> 内部的所有 <dd> 标签,也就是每部电影的信息所在的标签

select🔍 是 BeautifulSoup 对象的一个方法,它可以依据 CSS 选择器来筛选元素;CSS 选择器是一种用于选择 HTML 元素的语法,借助它能够快速定位到所需的元素。

然后定义一个空列表 movie_data_list,循环movie_items里面包含的每一个电影信息,从而提取出每个电影的名称、主演、评分、上映时间和电影封面地址等具体信息;接下来我们要找到电影图片的class属性,进入该网页TOP100榜 - 猫眼电影 - 一网打尽好电影右键电影图片,选择检查,然后一级一级的找到它的CSS属性.board-img,如下图所示,因为每个电影信息html结构一样,所以.board-img代表每个电影图片的属性,因此item.select_one('.board-img')是定位到图片所在的标签,接下来通过item.select_one('.board-img')获取data-src属性的值作为图片的 URL

我们以同样的方式,如下图所示,找到电影名称的CSS属性是.name,为了定位到.name下的<a>标签里面的文本,我们接着写select方法:name_tag=item.select_one('.name a'),通过name_tag来获取文本元素

movie_name = name_tag.text.strip()

电影评分、上映时间等信息也是按照以上步骤进行编码,其中需要注意的是如下图电影评分是有两个属性组成的,因此,需要我们写两个select方法并将它们组合起来,数据爬取的全部代码如下

        movie_items = soup.select('.board-wrapper dd')movie_data_list = []for item in movie_items:try:img_tag = item.select_one('.board-img')img_url = img_tag['data-src'] if img_tag and 'data-src' in img_tag.attrs else img_tag['src'] if img_tag else Noneif img_url and img_url.startswith('//'):img_url = 'https:' + img_urlname_tag = item.select_one('.name a')movie_name = name_tag.text.strip() if name_tag else Nonestars_tag = item.select_one('.star')stars = stars_tag.text.replace('主演:', '').strip() if stars_tag else Nonerelease_tag = item.select_one('.releasetime')release_time = release_tag.text.strip() if release_tag else Noneinteger_tag = item.select_one('.integer')fraction_tag = item.select_one('.fraction')score = (integer_tag.text.strip() + fraction_tag.text.strip()) if integer_tag and fraction_tag else None

最后获取到的数据以字典形式组织,包含movie_name(电影名称)、img_url(图片地址)、stars(主演)、release_time(上映时间)、score(评分)和crawl_time(抓取时间)。然后,批量插入到 MongoDB 数据库的top_movies集合中

                movie_data = {'movie_name': movie_name,'img_url': img_url,'stars': stars,'release_time': release_time,'score': score,'crawl_time': time.strftime('%Y-%m-%d %H:%M:%S')}movie_data_list.append(movie_data)

编写主函数运行程序

if __name__ == "__main__":scrape_maoyan_top100()

三. 运行结果

四. 更多干货

--------------------- - -----✈---------   ---------✈--------------------✈-------
1.如果我的博客对你有帮助或你喜欢我的博客内容,请 “👍点赞” “✍️评论” “★收藏” 一键三连哦!

2.❤️【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 优质文章】 带您学习各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、HTML模板 、微信小程序模板 、等! 「在这里一起探讨知识,互相学习」!

3.以上内容技术相关问题✉欢迎一起交流学习 ☟   ☟   ☟
————————————————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78763.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.5 事务与锁机制(ACID特性/事务控制语句)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL 事务与锁机制深度解析:ACID 特性与事务控制全流程2.5 事务与锁机制2.5.1 ACID 特性与实现原理2.5.1.1 ACID 核心概念2.5.1.2 MVCC(多版本并发控制)与WAL(预写式日志)协同效应2.5.2 事务…

荣耀A8互动娱乐组件部署实录(终章:后台配置系统与整体架构总结)

作者:被配置文件的“开关参数”折磨过无数次的运维兼后端工 一、后台系统架构概述 荣耀A8组件后台采用 PHP 构建,配合 MySQL 数据库与 Redis 缓存系统,整体结构遵循简化版的 MVC 模式。后台主要实现以下核心功能: 系统参数调控与配置热更新 用户管理(封号、授权、角色) …

Transformer 与 LSTM 在时序回归中的实践与优化

&#x1f9e0; 深度学习混合模型&#xff1a;Transformer 与 LSTM 在时序回归中的实践与优化 在处理多特征输入、多目标输出的时序回归任务时&#xff0c;结合 Transformer 和 LSTM 的混合模型已成为一种有效的解决方案。Transformer 擅长捕捉长距离依赖关系&#xff0c;而 LS…

QT —— 信号和槽(带参数的信号和槽函数)

QT —— 信号和槽&#xff08;带参数的信号和槽函数&#xff09; 带参的信号和槽函数信号参数个数和槽函数参数个数1. 参数匹配规则2. 实际代码示例✅ 合法连接&#xff08;槽参数 ≤ 信号参数&#xff09;❌ 非法连接&#xff08;槽参数 > 信号参数&#xff09; 3. 特殊处理…

设计模式简述(十七)备忘录模式

备忘录模式 描述组件使用 描述 备忘录模式用于将对象的状态进行保存为备忘录&#xff0c;以便在需要时可以从备忘录会对象状态&#xff1b;其核心点在于备忘录对象及其管理者是独立于原有对象之外的。 常用于需要回退、撤销功能的场景。 组件 原有对象&#xff08;包含自身…

标签语句分析

return userList.stream().filter(user -> {String tagsStr user.getTags(); 使用 Stream API 来过滤 userList 中的用户 解析 tagsStr 并根据标签进行过滤 假设 tagsStr 是一个 JSON 格式的字符串&#xff0c;存储了一个标签集合。你希望过滤出包含所有指定标签的用户。…

【应用密码学】实验四 公钥密码1——数学基础

一、实验要求与目的 学习快速模幂运算、扩展欧几里得、中国剩余定理的算法思想以及代码实现。 二、实验内容与步骤记录&#xff08;只记录关键步骤与结果&#xff0c;可截图&#xff0c;但注意排版与图片大小&#xff09; 1.快速模幂运算的设计思路 快速模幂运算的核心思想…

WebSocket与Socket、TCP、HTTP的关系及区别

1.什么是WebSocket及原理 WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生&#xff0c;解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题&#xff0c;实现里多路复用&#xff0c;是全双工、双向、单套…

基于C++的IOT网关和平台4:github项目ctGateway交互协议

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…

【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件

如何基于DeepSeek Kimi进行PPT制作 步骤&#xff1a; Step1&#xff1a;基于DeepSeek生成文本&#xff0c;提问 Step2基于生成的文本&#xff0c;用Kimi中PPT助手一键生成PPT 进行PPT渲染-自动渲染 可选择更改模版 生成PPT在桌面 介绍的比较详细&#xff0c;就是这个PPT模版…

拷贝多个Excel单元格区域为图片并粘贴到Word

Excel工作表Sheet1中有两个报表&#xff0c;相应单元格区域分别定义名称为Report1和Report2&#xff0c;如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…

Spring是如何传播事务的?什么是事务传播行为

Spring是如何传播事务的&#xff1f; Spring框架通过声明式事务管理来传播事务&#xff0c;主要依赖于AOP&#xff08;面向切面编程&#xff09;和事务拦截器来实现。Spring的事务传播机制是基于Java Transaction API (JTA) 或者本地资源管理器&#xff08;如Hibernate、JDBC等…

Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享

Python-pandas-操作Excel文件(读取数据/写入数据) 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…

PHP分页显示数据,在phpMyadmin中添加数据

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //设置字符集为utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //记录总条数$count。 $pagesize10;//每…

智能参谋部系统架构和业务场景功能实现

将以一个基于微服务和云原生理念、深度集成人工智能组件、强调实时性与韧性的系统架构为基础,详细阐述如何落地“智能参谋部”的各项能力。这不是一个简单的软件堆叠,而是一个有机整合了数据、知识、模型、流程与人员的复杂体系。 系统愿景:“智能参谋部”——基于AI赋能的…

企业级RAG架构设计:从FAISS索引到HyDE优化的全链路拆解,金融/医疗领域RAG落地案例与避坑指南(附架构图)

本文较长&#xff0c;纯干货&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习内容&#xff0c;尽在聚客AI学院。 一. RAG技术概述 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是…

Spring Boot Validation实战详解:从入门到自定义规则

目录 一、Spring Boot Validation简介 1.1 什么是spring-boot-starter-validation&#xff1f; 1.2 核心优势 二、快速集成与配置 2.1 添加依赖 2.2 基础配置 三、核心注解详解 3.1 常用校验注解 3.2 嵌套对象校验 四、实战开发步骤 4.1 DTO类定义校验规则 4.2 Cont…

理清缓存穿透、缓存击穿、缓存雪崩、缓存不一致的本质与解决方案

在构建高性能系统中&#xff0c;缓存&#xff08;如Redis&#xff09; 是不可或缺的关键组件&#xff0c;它大幅减轻了数据库压力、加快了响应速度。然而&#xff0c;在高并发环境下&#xff0c;缓存也可能带来一系列棘手的问题&#xff0c;如&#xff1a;缓存穿透、缓存击穿、…

PyTorch_构建线性回归

使用 PyTorch 的 API 来手动构建一个线性回归的假设函数&#xff0c;数据加载器&#xff0c;损失函数&#xff0c;优化方法&#xff0c;绘制训练过程中的损失变化。 数据构建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》&#xff1a;节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;复杂类型则有…