python爬虫案例精讲:爬取豆瓣电影Top250信息

news2025/1/15 23:35:32

前言

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

一、整体代码:

import csv
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.3'
}

# 豆瓣电影Top250的URL基础部分
base_url = "https://movie.douban.com/top250"
# 用于存储爬取到的电影信息的列表
movie_list = []

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

# 解析HTML内容,提取电影信息
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():
    # 每页25部电影,共10页
    for start in range(0, 250, 25):
        # 构造带有start参数的URL
        url = f"{base_url}?start={start}"
        # 获取网页内容
        html = get_page(url)
        # 解析网页内容
        parse_page(html)
    # 输出爬取到的电影信息
    for movie in movie_list:
        print(movie)

# 将电影信息保存到CSV文件
def save_to_csv():
    # 获取电影信息字典的键作为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()  # 保存数据到CSV文件
    print("爬取完成,数据已保存到 douban_top250.csv")  # 输出完成信息

二、流程分析:

首先,我们需要安装一些Python库来完成本次任务。以下是我们将使用的库:
requests:用来发送HTTP请求并获取网页内容。
BeautifulSoup:用来解析HTML页面,提取我们需要的数据。
因为我们使用的是Python进行爬虫,所以我们使用的命令行是

pip install requests beautifulsoup4 

2.1 定义请求头并获取响应:

   response = requests.get(url, headers=headers)

requests.get() 是requests库中的一个函数,用于发送HTTP GET请求。
url 是一个字符串,表示要请求的网页的URL地址。headers 是一个字典,用于设置请求头。请求头可以包含多种信息,例如用户代理(User-Agent),这是模拟浏览器访问网页的一种方式,避免被网站识别为爬虫。
其中常用的请求头为:

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60",
"Opera/8.0 (Windows NT 5.1; U; en)",
"Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50",

# Firefox
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",

# Safari
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",

# Chrome
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
  
# 360
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",

# 淘宝浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",

# 猎豹浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",

# QQ浏览器
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",

# sogou浏览器
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",

# maxthon浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36",

# UC浏览器
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36"

这行代码的具体作用是:向指定的URL发送一个HTTP GET请求。在请求中包含自定义的请求头信息。接收服务器返回的响应,并将其存储在response变量中。

2.2 处理html数据:

在获取到相应后,应用response.text方法获取到html数据,此数据包含网页上的所有信息,我们要想获取指定信息需要对它进行处理,在python中处理html数据的库为BeautifulSoup,具体使用方法为:

soup = BeautifulSoup(html, 'html.parser') 

参数:

html 是一个字符串,也就是上文提到的response.text,表示要解析的HTML文档的内容。
‘html.parser’ 是一个字符串,表示使用的解析器。这里使用的是Python内置的html.parser解析器。

之后就可以通过find_all方法查询具体的html数据信息,根据f12分析可知在这里插入图片描述

我们需要的电影信息都在div下的span div中故编写以下代码获得信息

 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)

获得好所需要的信息之后,我们需要获取所有网页的信息,
在这里插入图片描述
可以看到总共有25页,每页的格式为
在这里插入图片描述
https://movie.douban.com/top250?start=X,其中X为每页的起始索引(0, 25, 50, …)
故可通过循环来遍历所有网页:

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

2.3 保存数据:

在获取信息之后需要对信息进行保存,保存使用的是python内置库csv,首先使用了csv模块中的DictWriter类来创建一个写入器对象,然后使用该对象可以将字典格式的数据写入CSV文件。

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)  # 写入电影数据

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

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

相关文章

Node.js的url模块与querystring模块

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 4.3.1 http模块——创建HTTP服务器、客户端 要使用http模块&#xff0…

Vue0-生命周期-03

生命周期 生命周期指定就是一个对象从创建到销毁的整个过程。 Vue也是有的 完整的Vue周期包含8个阶段。 Vue官方生命周期流程图&#xff1a; 那这有什么用呢&#xff1f;我们可以在指定阶段做特殊的事件。 这些方法伴随生命周期的进行自动执行。 <!DOCTYPE html> <…

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

【Git 工具】用 IntelliJ IDEA 玩转 Git 分支与版本管理

文章目录 一、使用 IDEA 配置和操作 Git1.1 查看 Idea 中的 Git 配置1.2 克隆 Github 项目到本地 二、版本管理2.1 提交并推送修改2.2 拉取远程仓库2.3 查看历史2.4 版本回退 三、分支管理3.1 新建分支3.2 切换分支3.2 合并分支3.4 Cherry-Pick 参考资料 一、使用 IDEA 配置和操…

利用dockerCompose一键部署前后端分离项目

1.Docker Compose介绍 2.将自己准备好的docker-compose.yml文件上传到宿主机 3.查看docker-compose.yml文件 宿主机的文件内容可参考&#xff1a; 项目部署-通过docker手动部署前后端分离项目&#xff08;全网超级详细 的教程&#xff09;-CSDN博客 修改宿主机的nginx.conf …

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.

问题发现 最近在工作中用到了WebSocket进行前后端的消息通信&#xff0c;后端代码编写完后&#xff0c;测试一下是否连接成功&#xff0c;发现报No static resource websocket.&#xff0c;看这个错貌似将接口变成了静态资源来访问了&#xff0c;第一时间觉得是端点没有注册成…

(超详细图文)PLSQL Developer 配置连接远程 Oracle 服务

1、下载配置文件 &#xff08;超详细图文详情&#xff09;Navicat 配置连接 Oracle-CSDN博客 将下载的文件解压到单独文件夹&#xff0c;如&#xff1a;D:\App\App_Java\Oracle\instantclient-basic-windows.x64-19.25.0.0.0dbru 2、配置 打开 PLSQL Developer&#xff0c;登…

redis中的哨兵

redis中的哨兵 一、哨兵机制的概念二、redis哨兵的部署2.1 docker的安装2.2 编排redis主从节点2.3 配置哨兵节点 三、redis哨兵的选举机制3.1 redis-master宕机之后的情况3.2 重启redis-master后的情况 四、redis哨兵机制的原理4.1主观下线4.2客观下线4.3选举leader节点4.4选出…

《Django 5 By Example》阅读笔记:p339-p358

《Django 5 By Example》学习第12天&#xff0c;p339-p358总结&#xff0c;总计20页。 一、技术总结 1.项目(购物网站) django-admin startproject myshop 虽然这里只是示例&#xff0c;但我觉得这种命名为 myxxx 的习惯非常不好&#xff0c;因为在实际应用中&#xff0c;是…

EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列

使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码&#xff0c;我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格&#xff0c;按“CTRLD”向下填充&#xff0c;就可以得出其它几行“-”之前的…

【CANOE】【Capl】【RS232】控制串口设备

系列文章目录 内置函数&#xff0c;来控制传统的串口设备&#xff0c;比如继电器等 文章目录 系列文章目录前言一、控制串口二、自定义相关的参数RS232Configure**函数语法****函数功能****参数说明****返回值****示例代码** 三、回调函数的使用RS232OnSend**函数语法****函数…

配置泛微e9后端开发环境

配置泛微e9的后端开发环境 1.安装jdk1.8&#xff08;请自行安装并设置环境变量&#xff09; 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…

python+django5.1+docker实现CICD自动化部署springboot 项目前后端分离vue-element

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

【React】全局状态管理(Context, Reducer)

以下为知行小课学习笔记。 概述 Context 跨组件共享状态 在 Next 项目&#xff0c;封装 useContext。 AppContext.tsx "use client";import React, {createContext, Dispatch, ReactNode, SetStateAction, useContext, useMemo, useState} from react;type State …

ENSP IPv6-over-IPv4 OSPFv3

目前主流网络还是IPv4网络&#xff0c;IPv6网络尚未规模化部署。由于网络演进还存在较长时间IPv4到IPv6过渡期或IPv4和IPv6网络共存期。为此&#xff0c;国际标准组织为应对较长时间过渡期&#xff0c;形成了相关的过渡技术标准。目前主要存在三种过渡技术&#xff1a;双协议栈…

open-instruct - 训练开放式指令跟随语言模型

文章目录 关于 open-instruct设置训练微调偏好调整RLVR 污染检查开发中仓库结构 致谢 关于 open-instruct github : https://github.com/allenai/open-instruct 这个仓库是我们对在公共数据集上对流行的预训练语言模型进行指令微调的开放努力。我们发布这个仓库&#xff0c;并…

git使用(三)

git使用&#xff08;三&#xff09; git各阶段回退操作命令git checkout --git reset HEADgit reset --hardgit refloggit push -fgit diff HEAD -- git推送代码冲突解决方案两个人对不同代码段做修改两个人对相同代码段做修改 git各阶段回退操作命令 git checkout – 当在工作…

深度学习基础1

目录 1. 深度学习的定义 2.神经网络 2.1. 感知神经网络 2.2 人工神经元 2.2.1 构建人工神经元 2.2.2 组成部分 2.2.3 数学表示 2.2.4 对比生物神经元 2.3 深入神经网络 2.3.1 基本结构 2.3.2 网络构建 2.3.3 全连接神经网络 3.神经网络的参数初始化 3.1 固定值初…

设计模式-适配器模式-注册器模式

设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台&#xff0c;需要适配或接入不同的数据源&#xff0c;可能提供的方法参数和平台调用的方法参数不一致&#xff0c;可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…