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

基于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.以上内容技术相关问题✉欢迎一起交流学习 ☟   ☟   ☟
————————————————

相关文章:

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

前言&#xff1a;从猫眼电影排行榜页面&#xff08;TOP100榜 - 猫眼电影 - 一网打尽好电影 &#xff09;爬取 Top100 电影的电影名称、图片地址、主演、上映时间和评分等关键信息&#xff0c;并将这些信息存储到本地 MongoDB 数据库中&#xff0c;&#x1f517; 相关链接Xpath&…...

前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?

浏览器缓存&#xff0c;配置得当&#xff0c;它能让页面飞起来&#xff1b;配置错了&#xff0c;一次小小的上线&#xff0c;就能把你扔进线上 bug 的坑里。你可能遇到过这些情况&#xff1a; 部署上线了&#xff0c;结果用户还在加载旧的 JS&#xff1b;接口数据改了&#xf…...

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;以下是对这几种常见架构的分析&#xff1a; 一、软件架构 1.分层架构 描述&#xff1a;分层架构是一种经典的软件架构模式&#xff0c;将软件系统按照功能划分为不同的层次&#xff0c;一般包括表现层&#xff08;…...

STM32printf重定向到串口含armcc和gcc两种方案

STM32串口重定向&#xff1a;MDK与GCC环境下需重写的函数差异 在嵌入式开发中&#xff0c;尤其是使用 STM32系列微控制器 的项目中&#xff0c;调试信息的输出是不可或缺的一部分。为了方便调试&#xff0c;开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …...

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

平时上班真的比较累&#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系统 四、渗透防御 一、文件下载 本文通过…...

【中间件】brpc_基础_remote_task_queue

文章目录 remote task queue1 简介2 核心功能2.1 任务提交与分发2.2 无锁或低锁设计2.3 与 bthread 深度集成2.4 流量控制与背压 3 关键实现机制3.1 数据结构3.2 任务提交接口3.3 任务窃取&#xff08;Work Stealing&#xff09;3.4 同步与唤醒 4 性能优化5 典型应用场景6 代码…...

maven坐标导入jar包时剔除不需要的内容

maven坐标导入jar包时剔除不需要的内容 问题描述解决方案 问题描述 maven坐标导入jar包时剔除不需要的内容 解决方案 Spring Boot 默认使用 Logback&#xff0c;需在 pom.xml 中排除其依赖&#xff1a; <dependency><groupId>org.springframework.boot</gro…...

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…...

ValueError: Could not find common ancestor of[]

ValueError: Could not find common ancestor of [0004_deadstockstathistorymodel, 0026_remove_orderdetailmodel_order_no]说明 Django 当前在 尝试生成迁移或者执行迁移 时&#xff0c;发现你的迁移历史“断裂”了&#xff1a; 你这个 App 的迁移历史有两个分支&#xff0c…...

具身系列——比较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…...

PyTorch_自动微分模块

自动微分 (Autograd) 模块对张量做了进一步的封装&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;在神经网络的反向传播过程中&#xff0c;Autograd 模块基于正向计算的结果对当前的参数进行微分计算&#xff0c;从而实现网络权重参数的更…...

【Git】【commit】查看未推送的提交查看指定commit的修改内容合并不连续的commit

文章目录 1. 查看未推送的提交方法一 &#xff1a;git status方法二&#xff1a;git log方法三&#xff1a;git cherry方法四&#xff1a;git rev-list 2. 查看指定commit的修改方法一&#xff1a;git show方法二&#xff1a;git log方法三&#xff1a;git diff 3. 合并不连续的…...

手写 Vue 源码 === 依赖清理机制详解

目录 引言 响应式系统基础回顾 依赖清理的必要性 ReactiveEffect 类的设计 依赖清理的三个关键函数 1. preCleanEffect:执行前的准备 2. trackEffects:依赖收集与 diff 算法 3. postCleanEffect:执行后的清理 4. cleanDepEffect:清理依赖 实际案例分析 依赖清理算…...

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…...

DDR在PCB布局布线时的注意事项及设计要点

一、布局注意事项 控制器与DDR颗粒的布局 靠近原则&#xff1a;控制器与DDR颗粒应尽量靠近&#xff0c;缩短时钟&#xff08;CLK&#xff09;、地址/控制线&#xff08;CA&#xff09;、数据线&#xff08;DQ/DQS&#xff09;的走线长度&#xff0c;减少信号延迟差异。 分组隔…...

【每天学习一点点】使用Python的pathlib模块分割文件路径

使用Python的pathlib模块分割文件路径 pathlib模块&#xff08;Python 3.4&#xff09;提供了面向对象的文件系统路径操作方式&#xff0c;比传统的os.path更加直观和易用。以下是使用pathlib分割文件路径的几种方法&#xff1a; 基本路径分割 from pathlib import Path# 创…...

Hydra详细教程:入门、入狱,和使用与注意事项

警告&#xff1a;本文档仅供学习和授权测试目的使用。未经授权对计算机系统进行渗透测试是非法行为。请务必在获得明确许可的情况下使用Hydra&#xff0c;并遵守所有适用的法律法规。滥用此工具可能导致严重的法律后果。 什么是Hydra&#xff1f; Hydra是一款非常流行的开源网…...

【C++游戏引擎开发】第32篇:物理引擎(Bullet)—约束系统

一、约束系统基础理论 1.1 物理约束的本质 1.1.1 约束的数学描述 在刚体动力学中,约束的本质是通过数学方程限制刚体的运动自由度。对于两个刚体A和B的约束关系,可以用以下方程表示: Φ ( q A , q B , t ) = 0...

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

继续分享最新的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;帮助你为你的使用场景构建最佳…...

NGINX `ngx_http_charset_module` 字符集声明与编码转换

一、模块定位与功能 ngx_http_charset_module 主要提供两大能力&#xff1a; 响应头声明&#xff1a;在 Content-Type 头部自动添加 ; charsetXXX&#xff0c;告知客户端所用字符集。单向编码转换&#xff1a;在 NGINX 层将一种单字节编码&#xff08;如 koi8-r、windows-125…...

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

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

Python中的re库详细用法与代码解析

目录 1. 前言 2. 正则表达式的基本概念 2.1 什么是正则表达式&#xff1f; 2.2 常用元字符 3. re库的适应场景 3.1 验证用户输入 3.2 从文本中提取信息 3.3 文本替换与格式化 3.4 分割复杂字符串 3.5 数据清洗与预处理 4. re库的核心功能详解 4.1 re.match()&#…...

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;中英文逗号不同。 可以先通…...

第十六届蓝桥杯大赛软件赛C/C++大学B组部分题解

第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标(233,666)。在移动过程中&#xff0c;他只能采用以下两种移动方式&#xff0c;并且这两种移动方式可以交替、不限次数地使用&#xff1a; 水平向右移动…...