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

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

前言

在这篇博客中,我们将学习如何使用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.kler.cn/a/416428.html

相关文章:

  • 解决idea使用maven打包时无法将本地lib库文件和resource目录中的资源文件打包进jar文件的问题!!!
  • 介绍 Apache Spark 的基本概念和在大数据分析中的应用
  • 十二、Pod的扩缩容-手动/自动-HPA
  • 【HarmonyOS NEXT】ACL 受限权限申请
  • 命令行配置Windows对接VPN网关
  • 【广告投放系统】头条可视化投放平台vue3+element-plus+vite落地历程和心得体会
  • 初识Hive
  • 41 基于单片机的小车行走加温湿度检测系统
  • spring +fastjson 的 rce
  • 【赵渝强老师】PostgreSQL的数据库
  • 线段树与树状数组 (C++)
  • OpenAI浅聊爬虫
  • # issue 7 TCP回声服务器和客户端
  • RPA:电商订单处理自动化
  • Rust format失败
  • 在Java中使用Apache POI导入导出Excel(二)
  • Milvus 2.5:全文检索上线,标量过滤提速,易用性再突破!
  • JS-对象-DOM-案例
  • request和websocket
  • python自动化测开面试题汇总(持续更新)