首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Python爬虫五十个小案例】爬取豆瓣电影Top250

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

原创
作者头像
小馒头学Python
发布2024-11-25 09:01:46
发布2024-11-25 09:01:46
1.8K0
举报
文章被收录于专栏:小馒头学Python小馒头学Python

今日推荐

在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!

今日推荐:使用Python实现智能食品安全追溯系统的深度学习模型

文章链接:https://cloud.tencent.com/developer/article/2470420

通过这篇文章,你将能够深入了解SQL注入的原理、攻击示例以及防御方法。SQL注入是一种常见的安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码,诱使应用程序执行非预期的SQL命令,从而获取敏感数据或破坏数据库。文中展示了通过参数化查询、使用ORM框架、输入验证和清理以及最小权限原则等方法,有效防止SQL注入攻击。通过参数化查询和ORM框架,可以确保用户输入不会被解释为SQL代码,而输入验证和清理可以增加安全性,最小权限原则则确保数据库用户具有最低必要的权限。总结强调了遵循最佳实践的重要性,以确保应用程序的安全性。

🪲前言

在这篇博客中,我们将学习如何使用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进行解析

代码语言:python
复制
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

代码语言:python
复制
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, ...)

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

代码语言:Python
复制
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文件中

代码语言:Python
复制
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那么可以参考下面的案例代码

代码语言:python
复制
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文件

🪲完整的代码

代码语言:python
复制
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文件会乱码的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日推荐
  • 🪲前言
  • 🪲环境准备
  • 🪲爬虫原理与分析
  • 🪲代码具体的实现
    • 发送请求获取网页内容
    • 解析网页内容
    • 提取电影数据
    • 保存数据到CSV文件或者Excel文件
  • 🪲完整的代码
  • 🪲运行效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档