【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').textrating = movie.find('span', class_='rating_num').textdirector, 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 csvdef 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)  # 将电影列表转换为DataFramedf.to_excel('douban_top250.xlsx', index=False, engine='openpyxl')  # 保存为Excel文件

🪲完整的代码

import csvimport 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').textrating = movie.find('span', class_='rating_num').textdirector_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页的豆瓣Top250for 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

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

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

相关文章

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。适用场景&…

PGSQL学习笔记 -- 从入门到放弃

pgsq学习笔记 一、基本语法(一)增删改查(二)PostgreSQL 语法详细介绍及示例 二、数据类型(一)基本数据类型(二)复合类型(三)JSON 和 XML 数据类型&#xff08…

P1198 [JSOI2008] 最大数

P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士:单调队列 思路: 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的(真无语了) 我们可以在每次插入时整一个叫…

【C++】入门【一】

本节目标 一、C关键字(C98) 二、命名空间 三、C的输入输出 四、缺省函数 五、函数重载 六、引用 七、内联函数 八、auto关键字(C11) 九、范围for(C11) 十、指针空值nullptr(C11) 一.…

RabbitMQ7:消息转换器

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)

通过bdf号查看 -s (bus) lspci -s 03:00.0通过vendor id或者device id等设备查看 -d (device) lspci -d 15b3: #这里是vendor号,所以在前面 lspci -d :1021 #这里是设备号,所以要:在前vendorid和deviceid…

基于Matlab深度学习的CT影像识别系统研究与实现

通过使用AlexNet、GoogLeNet和VGGNet等预训练模型,并结合迁移学习技术,对CT影像进行特征提取和分类。系统在公开数据集上进行了训练和测试,结果表明,该方法能够有效区分COVID-19和非COVID-19的CT影像,具有较高的准确率…

操作系统 锁——针对实习面试

目录 操作系统 锁什么是死锁?说说死锁产生的条件?死锁如何预防?死锁如何避免?银行家算法具体怎么操作?死锁如何解决?死锁会产生什么影响?乐观锁与悲观锁有什么区别? 操作系统 锁 什么…

【NLP 1、人工智能与NLP简介】

人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…

C#结构体排序(数组)

结构体排序(数组) 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…

搭建AI知识库:打造坚实的团队知识堡垒

在信息爆炸的时代,企业面临着知识管理的挑战。团队知识堡垒的构建,即搭建一个高效的AI知识库,对于保护和利用知识资产、提升团队协作效率和创新能力至关重要。本文将探讨搭建AI知识库的重要性、策略以及如何通过这一系统打造坚实的团队知识堡…

(五)Ubuntu22.04+Stable-Diffusion-webui AI绘画 模型转换插件安装及其使用

一、说明 这是秋叶大佬开发的一个模型转换插件,秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件,请使用下面这个地址安装,安装完成之后别忘了重启 WebUI。 模型转换插件 https://github.com/Akegarasu/sd-webui-model-c…

DevExpress的web Dashboard应用

本文旨在从零开始创建一个包含dashboard的应用 一、前期准备 1、语言:C# 2、软件:Visual Studio 2019 3、框架:DevExpress19.2(付费)、ASP.NET(Web) 4、组件:dashboard 二、创建ASP.NET Web窗体仪表板应用程序 1、创建一个空的w…

记录下在html文件中如何直接使用npm依赖,以threejs为例

参考&#xff1a; https://www.cnblogs.com/shayloyuki/p/17191489.html 共三种方式 我的代码截图 方式一&#xff1a; threejsDemo_script.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&…

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中&#xff0c;动画可以为用户界面增添生动、流畅的交互效果&#xff0c;提升用户对应用的好感度。然而&#xff0c;滥用动画也会导致应用性能下降&#xff0c;消耗过多的系统资源&#xff0c;…

C#变量和函数如何和unity组件绑定

1.Button On_click (1)GameObject通过Add component添加上Script (2)Button选GameObject组件而不是直接选Script,直接选Script出现不了Script中的函数 2.RawImage 上面是错的 3.Text 上面是错的&#xff0c;应该是直接在GameObject里面填上对应的值 总结&#xff1a; …

el-dialog中调用resetFields()方法重置表单报错

前言 在开发中&#xff0c;弹框和表单是两个常见的组件&#xff0c;它们通常一起使用以实现用户交互和数据输入。然而&#xff0c;当我们尝试在弹框中调用表单的 resetFields() 方法时&#xff0c;有时会遇到报错的情况。 一、用法错误 确保 this.$refs[ruleForm].resetFields…

TCP网络套接字

引言 前面我们已经介绍了udp套接字的相关编写&#xff0c;本文主要介绍TCP套接字的相关接口和一些相关知识&#xff0c;方便大家后续对TCP的进一步理解。 相关接口 1、socket 这个接口我们已经在前面有所了解&#xff0c;这里我们再重新回顾一下 第一个参数我们依然使用AF…

rustdesk 自建服务

RustDesk 部署RustDesk sudo docker image pull rustdesk/rustdesk-server sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --nethost rustdesk/rustdesk-server hbbs sudo docker run --name hbbr -p 2111…

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…