【Python爬虫五十个小案例】爬取豆瓣电影Top250

请添加图片描述

博客主页:小馒头学python

本文专栏: Python爬虫五十个小案例

专栏简介:分享五十个Python爬虫小案例

在这里插入图片描述

🪲前言

在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,BeautifulSoup库来解析HTML页面,并将数据存储到CSV文件中。这个爬虫将自动获取豆瓣电影Top250页面的信息,包括电影名称、导演、主演、评分等详细信息

豆瓣电影Top250是一个包含豆瓣评分最高的250部电影的榜单,是电影爱好者查找电影的一大宝库。本博客将指导大家如何通过编写Python爬虫自动获取豆瓣电影Top250的数据

🪲环境准备

首先,我们需要安装一些Python库来完成本次任务。以下是我们将使用的库:

  • requests:用来发送HTTP请求并获取网页内容。
  • BeautifulSoup:用来解析HTML页面,提取我们需要的数据。
  • csv:将爬取的数据保存到CSV文件中。

因为我们使用的是Python进行爬虫,所以我们使用的命令行是

pip install requests beautifulsoup4 csv

🪲爬虫原理与分析

豆瓣电影Top250的URL是 https://movie.douban.com/top250。页面内容是分页显示的,每一页展示25部电影,最多5页。我们需要访问这些页面并提取电影数据

数据结构分析

每一部电影的信息在HTML结构中都有相应的标签,我们需要从中提取出以下信息:

  • 电影名称
  • 电影评分
  • 电影导演
  • 电影主演
  • 电影年份
  • 电影类型

通过使用BeautifulSoup解析HTML,我们可以轻松提取这些信息

🪲代码具体的实现

发送请求获取网页内容

我们首先使用requests库发送请求来获取网页内容。豆瓣会返回HTML页面,我们将把这些内容传递给BeautifulSoup进行解析

import requests
from bs4 import BeautifulSoup

# 设置请求头,避免被豆瓣屏蔽
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

# 获取豆瓣电影Top250的前五页数据
base_url = "https://movie.douban.com/top250"
movie_list = []

def get_page(url):
    response = requests.get(url, headers=headers)
    return response.text

解析网页内容

使用BeautifulSoup解析HTML页面,找到每部电影的信息。每部电影的信息包含在div标签中,类名为item

def parse_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    movies = soup.find_all('div', class_='item')

    for movie in movies:
        title = movie.find('span', class_='title').text
        rating = movie.find('span', class_='rating_num').text
        director, actors = movie.find('div', class_='bd').find('p').text.strip().split("\n")[:2]
        year = movie.find('div', class_='bd').find('p').text.strip().split("\n")[0]
        movie_type = movie.find('span', class_='genre').text.strip()
        
        movie_info = {
            'title': title,
            'rating': rating,
            'director': director,
            'actors': actors,
            'year': year,
            'type': movie_type
        }
        
        movie_list.append(movie_info)

提取电影数据

我们现在可以循环访问每一页的URL并提取数据。豆瓣电影Top250有5页,URL结构为https://movie.douban.com/top250?start=X,其中X为每页的起始索引(0, 25, 50, …)

接下来我们的其他案例也会采取类似的分析方式,同学们可以

def main():
    for start in range(0, 250, 25):
        url = f"{base_url}?start={start}"
        html = get_page(url)
        parse_page(html)

    # 输出结果
    for movie in movie_list:
        print(movie)

if __name__ == "__main__":
    main()

保存数据到CSV文件或者Excel文件

为了方便后续的数据分析,我们可以将数据保存到CSV文件中

import csv

def save_to_csv():
    keys = movie_list[0].keys()
    with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as output_file:
        dict_writer = csv.DictWriter(output_file, fieldnames=keys)
        dict_writer.writeheader()
        dict_writer.writerows(movie_list)

save_to_csv()

如果是Excel那么可以参考下面的案例代码

import pandas as pd  # 导入pandas库

def save_to_excel():
    df = pd.DataFrame(movie_list)  # 将电影列表转换为DataFrame
    df.to_excel('douban_top250.xlsx', index=False, engine='openpyxl')  # 保存为Excel文件

🪲完整的代码

import csv

import requests
from bs4 import BeautifulSoup
import pandas as pd  # 导入pandas库

# 设置请求头,避免被豆瓣屏蔽
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

# 获取豆瓣电影Top250的前五页数据
base_url = "https://movie.douban.com/top250"
movie_list = []


# 发送请求获取网页内容
def get_page(url):
    response = requests.get(url, headers=headers)
    return response.text


# 解析网页内容并提取电影信息
def parse_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    movies = soup.find_all('div', class_='item')

    for movie in movies:
        title = movie.find('span', class_='title').text
        rating = movie.find('span', class_='rating_num').text
        director_actors = movie.find('div', class_='bd').find('p').text.strip().split("\n")[:2]
        director = director_actors[0]
        actors = director_actors[1] if len(director_actors) > 1 else ''

        # 处理电影类型,避免找不到的情况
        genre_tag = movie.find('span', class_='genre')
        movie_type = genre_tag.text.strip() if genre_tag else '未知'

        # 处理电影年份
        year_tag = movie.find('div', class_='bd').find('p').text.strip().split("\n")[0]

        # 构建电影信息字典
        movie_info = {
            'title': title,
            'rating': rating,
            'director': director,
            'actors': actors,
            'year': year_tag,
            'type': movie_type
        }

        # 将电影信息添加到列表中
        movie_list.append(movie_info)


# 爬取豆瓣电影Top250的所有页面
def main():
    # 遍历前5页的豆瓣Top250
    for start in range(0, 250, 25):
        url = f"{base_url}?start={start}"
        html = get_page(url)
        parse_page(html)

    # 输出结果
    for movie in movie_list:
        print(movie)


def save_to_csv():
    keys = movie_list[0].keys()  # 获取电影数据字典的键(即列名)

    # 写入CSV文件
    with open('douban_top250.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
        dict_writer = csv.DictWriter(output_file, fieldnames=keys)
        dict_writer.writeheader()  # 写入列名
        dict_writer.writerows(movie_list)  # 写入电影数据


# 主函数
if __name__ == "__main__":
    main()
    save_to_csv()
    print("爬取完成,数据已保存到 douban_top250.csv")

🪲运行效果

运行上述代码后,你将会得到一个名为douban_top250.csv的文件,文件内容如下所示:

在这里插入图片描述

下图是保存为csv文件的格式,这里注意encoding=‘utf-8-sig’,encoding如果等于utf-8,那么直接双击csv文件会乱码的

在这里插入图片描述

🪲总结

本文主要介绍了如果使用简单的爬虫进行数据的爬取,这里主要进行豆瓣电影Top250的数据爬取,我们使用的库就是requests、bs4、pandas、csv等库,本节主要重在案例的实践,还想了解更多的爬虫案例可以关注我的专栏

Python爬虫五十个小案例:https://blog.csdn.net/null18/category_12840403.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12840403&sharerefer=PC&sharesource=null18&sharefrom=from_link

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE_使用el.animate实现自定义指令抖动效果

// 在 Vue 2 中注册自定义指令 Vue.directive(shake,{// 当被绑定的元素插入到 DOM 中时inserted(el, binding){let value binding.valueconsole.log(el, binding)// 设置 transform-origin 样式el.style.transformOrigin center bottom;const keyframes [{ transform: rota…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊,时代发展这么快,在时代的洪流下,我们个人能抓住些什么呢。我问了大模型,文心一言是这样回答的: 在快速发展的时代背景下,个人确实面临着诸多挑战,但同时也充满…

探索光耦:光耦安全标准解读——确保设备隔离与安全的重要规范

在现代科技日新月异的今天,光耦(光电耦合器)作为电子设备中不可或缺的隔离元件,其重要性不言而喻。它不仅在电源调控、工业自动化及医疗设备等关键领域大显身手,更是确保系统电气隔离与运行稳定的守护神。特别是在保障…

嵌入式驱动开发详解2(设备挂载问题)

文章目录 前言设备号设备号的组成设备号的分配静态分配动态分配 驱动挂载与卸载设备节点创建驱动挂载出现问题 前言 驱动的设备挂载和卸载是十分重要的内容,一旦操作不当可能会导致系统崩溃,接下来我将用字符设备的驱动挂载原理进行详细讲解&#xff0c…

Hadoop分布式文件系统(一)——HDFS简介

目录 1. HDFS设计目标2. HDFS组件3. HDFS数据复制4. HDFS健壮性4.1 磁盘数据错误,心跳检测和重新复制4.2 集群均衡4.3 数据完整性4.4 元数据磁盘错误4.5 快照 5. HDFS数据组织5.1 数据块存储5.2 流水线复制5.3 文件的删除和恢复 参考 1. HDFS设计目标 1.错误检测和快…

VUE练习

使用new Vue()创建Vue实例&#xff0c;传入配置对象&#xff08;el data&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies

目录 Abtract 相关工作 核心算法&#xff1a; 整体流程概述 具体流程解析 1. 输入&#xff08;Input&#xff09; 2. 稀疏结构 VAE&#xff08;Sparse Structure VAE&#xff09; 3.分层体素潜在扩散&#xff08;Hierarchical Voxel Latent Diffusion&#xff09;…

js.二叉搜索树中第K小的元素

链接&#xff1a;230. 二叉搜索树中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1…

RabbitMQ 安装延迟队列插件 rabbitmq_delayed_message_exchange

前言&#xff1a; RabbitMQ 延迟队列插件&#xff08;rabbitmq_delayed_message_exchange&#xff09;是一个社区开发的插件&#xff0c;它为 RabbitMQ 添加了支持延迟消息的功能。通过这个插件&#xff0c;用户可以创建一种特殊的交换机类型 x-delayed-message&#xff0c;该…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

d3-contour 生成等高线图

D3.js 是一个强大的 JavaScript 库&#xff0c;用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块&#xff0c;用于生成等高线图&#xff08;contour plots&#xff09;。 属性和方法 属性 x: 一个函数&#xff0c;用于从数据点中提取 x 坐标。y: 一个函…

Apache Zeppelin:一个基于Web的大数据可视化分析平台

今天给大家推荐一下 Apache Zeppelin&#xff0c;它是一个基于 Web 的交互式数据接入、数据分析、数据可视化以及协作文档 Notebook&#xff0c;类似于 Jupyter Notebook。 Apache Zeppelin 支持使用 SQL、Java、Scala、Python、R 等编程语言进行数据处理和分析&#xff0c;同时…

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo&#xff0c;想赶快在电脑上 pip install 一下跑起来&#xff0c;发现因为 python 的 venv、conda 环境还挺费劲的&#xff0c;因为随着时间的发展&#xff0c;之前记得很清楚的 venv、conda 的用法&#xff0c;不经常使用&#xff0c;半天跑不起…

计算机网络 实验八 应用层相关协议分析

一、实验目的 熟悉CMailServer邮件服务软件和Outlook Express客户端软件的基本配置与使用&#xff1b;分析SMTP及POP3协议报文格式和SMTP及POP3协议的工作过程。 二、实验原理 为了观察到邮件发送的全部过程&#xff0c;需要在本地计算机上配置邮件服务器和客户代理。在这里我…

vue 实现关键字高亮效果

vue 实现关键字高亮效果 这是啥子意思呢&#xff0c;就是类似于百度搜索&#xff0c;根据关键词搜索结果&#xff0c;搜索结果中&#xff0c;与关键词相同的字显示红色&#xff0c;仅此而已&#xff0c;没有什么大的功能。简单写一下demo。 环境 我使用的是 vue3 ts 的语法来…

【大数据学习 | Spark-Core】广播变量和累加器

1. 共享变量 Spark两种共享变量&#xff1a;广播变量&#xff08;broadcast variable&#xff09;与累加器&#xff08;accumulator&#xff09;。 累加器用来对信息进行聚合&#xff0c;相当于mapreduce中的counter&#xff1b;而广播变量用来高效分发较大的对象&#xff0c…

2024年11月24日Github流行趋势

项目名称&#xff1a;FreeCAD 项目维护者&#xff1a;wwmayer, yorikvanhavre, berndhahnebach, chennes, WandererFan等项目介绍&#xff1a;FreeCAD是一个免费且开源的多平台3D参数化建模工具。项目star数&#xff1a;20,875项目fork数&#xff1a;4,117 项目名称&#xff1…

零基础学安全--shell脚本学习(1)脚本创建执行及变量使用

目录 学习连接 什么是shell shell的分类 查看当前系统支持shell 学习前提 开始学习 第一种执行脚本方法 ​编辑 第二种执行脚本方法 第三种执行脚本方法 变量声明和定义 ​编辑 查看变量 删除变量 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣…

Java后端如何进行文件上传和下载 —— 本地版

简介&#xff1a; 本文详细介绍了在Java后端进行文件上传和下载的实现方法&#xff0c;包括文件上传保存到本地的完整流程、文件下载的代码实现&#xff0c;以及如何处理文件预览、下载大小限制和运行失败的问题&#xff0c;并提供了完整的代码示例。 大体思路 1、文件上传 …