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

news2025/5/10 1:02:46

前言:从猫眼电影排行榜页面(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.text
        with 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 None
                if img_url and img_url.startswith('//'):
                    img_url = 'https:' + img_url
                name_tag = item.select_one('.name a')
                movie_name = name_tag.text.strip() if name_tag else None
                stars_tag = item.select_one('.star')
                stars = stars_tag.text.replace('主演:', '').strip() if stars_tag else None
                release_tag = item.select_one('.releasetime')
                release_time = release_tag.text.strip() if release_tag else None
                integer_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.coloradmin.cn/o/2371917.html

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

相关文章

Ubuntu 单机多卡部署脚本: vLLM + DeepSeek 70B

# 部署脚本&#xff1a;Ubuntu vLLM DeepSeek 70B # 执行前请确保&#xff1a;1. 系统为 Ubuntu 20.04/22.04 2. 拥有NVIDIA显卡(显存≥24G) # 保存两个文件 1 init.sh 初始化 2、test.sh 测试 # init.sh #!/bin/bash # 系统更新与基础依赖sudo apt update && s…

为了摸鱼和吃瓜,我开发了一个网站

平时上班真的比较累&#xff0c;摸鱼和吃瓜还要跳转多个平台的话&#xff0c;就累上加累了。 所以做了一个聚合了全网主流平台热搜的网站。 目前市面上确实有很多这种网站了&#xff0c;所以目前最主要有两点和他们不同&#xff1a; 给热搜列表增加了配图&#xff0c;刷的时候…

Webug4.0靶场通关笔记11- 第15关任意文件下载与第16关MySQL配置文件下载

目录 一、文件下载 二、第15关 任意文件下载 1.打开靶场 2.源码分析 3.渗透实战 三、第16关 MySQL配置文件下载 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 四、渗透防御 一、文件下载 本文通过…

k8s监控方案实践(一):部署Prometheus与Node Exporter

k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter 文章目录 k8s监控方案实践&#xff08;一&#xff09;&#xff1a;部署Prometheus与Node Exporter一、Prometheus简介二、PrometheusNode Exporter实战部署1. 创建Namespace&#xff08;p…

具身系列——比较3种vpg算法方式玩CartPole游戏(强化学习)

文档1方式参考&#xff1a;https://gitee.com/chencib/ailib/blob/master/rl/vpg_baseline_cartpole.py 文档2方式参考&#xff1a;https://gitee.com/chencib/ailib/blob/master/rl/vpg_batchupdate_cartpole.py 文档3方式参考&#xff1a;https://gitee.com/chencib/ailib/bl…

面向未来的 TCP 协议设计:可扩展与兼容并存

目录 1.设计思路 &#xff08;1&#xff09;完整数据结构&#xff08;字节布局&#xff09; 1&#xff09;字段解释&#xff1a; 2&#xff09;Flags字段设计&#xff08;1字节位图&#xff09; &#xff08;2&#xff09;进阶版 Java 解码器实现&#xff08;示例&#xf…

LSB图像信息隐藏系统(MATLAB)

图像信息隐藏系统 系统概述 图像信息隐藏系统是一个基于MATLAB开发的图像隐写工具&#xff0c;采用自适应LSB&#xff08;最低有效位&#xff09;隐写算法&#xff0c;实现了信息在图像中的隐藏与提取功能。系统配备了直观的图形用户界面&#xff0c;支持图像分析、信息隐藏、…

C++GO语言微服务项目之 go语言基础语法

目录 01 变量定义 02 自增语法 03 指针 04 go不支持的语法 05 string 06 定长数组-forrange 07 动态数组追加元素 08 切片截取-copy-make介绍 09 map介绍 10 函数 11 内存逃逸 12 import 13 命令行参数-switch 14 标签与continue-goto-break配合使用 15 枚举cons…

最新字节跳动运维云原生面经分享

继续分享最新的go面经。 今天分享的是组织内部的朋友在字节的go运维工程师岗位的云原生方向的面经&#xff0c;涉及Prometheus、Kubernetes、CI/CD、网络代理、MySQL主从、Redis哨兵、系统调优及基础命令行工具等知识点&#xff0c;问题我都整理在下面了 面经详解 Prometheus …

理解 Elasticsearch 的评分机制和 Explain API

作者&#xff1a;来自 Elastic Kofi Bartlett 深入了解 Elasticsearch 的评分机制并探索 Explain API。 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新功能&#xff0c;帮助你为你的使用场景构建最佳…

视频编解码学习三之显示器

整理自&#xff1a;显示器_百度百科&#xff0c;触摸屏_百度百科,百度安全验证 分为阴极射线管显示器&#xff08;CRT&#xff09;&#xff0c;等离子显示器PDP&#xff0c;液晶显示器LCD 液晶显示器的组成。一般来说&#xff0c;液晶显示器由以下几个部分组成&#xff1a; […

K8s网络从0到1

K8s网络从0到1 前言 K8s是一个强大的平台&#xff0c;但它的网络比较复杂&#xff0c;涉及很多概念&#xff0c;例如Pod网络&#xff0c;Service网络&#xff0c;Cluster IPs&#xff0c;NodePort&#xff0c;LoadBalancer和Ingress等等。为了帮助大家理解&#xff0c;模仿TC…

13.Excel:分列

一 分列的作用 将一个单元格中的内容拆分到两个或多个单元格当中。 二 如何使用 1.常规分列使用 注意&#xff1a;分列功能一次只能拆分一列。 长度一致或者数据间有分隔符。 补充&#xff1a;快速选择一列。 CTRL shift 向下箭头。 补充&#xff1a;中英文逗号不同。 可以先通…

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…

Gin优雅关闭 graceful-shutdown

文章目录 优雅关闭示例 - Close 方法项目结构使用方法代码如下代码说明如果去掉代码中的数字1&#xff0c;会发生什么 优雅关闭示例项目结构使用方法使用上下文通知不使用上下文通知 代码 notify-without-context-server.go代码说明 代码 notify-with-context-server.go代码说明…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…

JavaWeb:后端web基础(TomcatServletHTTP)

一、今日内容 二、Tomcat 介绍与使用 介绍 基本使用 小结 配置 配置 查找进程 三、Servlet 什么是Servlet 快速入门 需求 步骤 1.新建工程-模块&#xff08;Maven&#xff09; 2.修改打包方式-war 3.编写代码 /*** 可以选择继承HttpServlet*/ WebServlet("/hello&q…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…

Cursor —— AI编辑器 使用详解

Cursor - The AI Code Editor 一、Cursor 是什么&#xff1f; Cursor 是一款优秀的AI代码编辑器&#xff0c;它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说&#xff0c;就是&#xff1a;Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性&#xff08;代码补全、…

Pytorch-CUDA版本环境配置

Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户&#xff0c;需配置Pytorch的CUDA版本&#xff0c;分为三步&#xff1a; 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址&#xff1a; https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA Too…