📜  使用Python抓取 IMDB 电影评分和详细信息(1)

📅  最后修改于: 2023-12-03 14:49:50.492000             🧑  作者: Mango

使用Python抓取IMDB电影评分和详细信息

如今,随着互联网的发展,人们在选择一部电影去观看时,更倾向于查看电影评分和详细信息。而IMDB作为全球最大的电影数据库之一,它的电影评分和详细信息自然成为很多人的首选。

那么,如何使用Python抓取IMDB电影评分和详细信息呢?接下来,我们将为您介绍一种较为简便的方法。

思路讲解

我们的思路是通过爬虫程序获取IMDB电影主页上的电影评分、电影名称、电影导演、电影类型等相关信息,把这些数据保存到MySQL数据库中,再通过Python程序从数据库中读取数据并进行分析。

实现步骤
1. 安装必要的Python库

我们需要安装以下两个Python库:

  1. requests库,用于获取网页HTML源码;
  2. BeautifulSoup库,用于解析HTML源码。

如下所示是两个库的安装方法(假设已经安装好了pip):

$ pip install requests
$ pip install beautifulsoup4
2. 从IMDB网站上获取电影主页的链接

IMDB网站的电影主页标准链接格式如下所示:

https://www.imdb.com/title/<电影ID>/

我们可以通过访问https://www.imdb.com/chart/top获取IMDB的电影排名列表,进而获取每部电影的<电影ID>

在本例中,我们展示的是如何获取IMDB前250名电影的相关信息。因此,我们需要使用以下链接去获取前250名电影的信息:

https://www.imdb.com/chart/top?ref_=nv_mv_250

对于每个电影,我们需要获取电影的标题,IMDB评分,电影导演,电影类型以及电影海报的链接。因此,我们需要解析IMDB电影主页的HTML内容,从HTML中提取所需的信息。

在Python程序中,我们可以使用以下代码来获取IMDB电影排名列表并解析HTML内容:

import requests
from bs4 import BeautifulSoup

url = 'https://www.imdb.com/chart/top?ref_=nv_mv_250'
response = requests.get(url)
html = response.text

soup = BeautifulSoup(html, 'html.parser')
3. 解析电影主页HTML内容

我们需要用BeautifulSoup库解析电影主页HTML内容,这个步骤主要是获取每个电影的详细信息。

在IMDB电影主页中,电影标题被包含在一个<div>标签中,这个标签具有class属性titleColumn,而评分则被包含在一个<div>标签中,这个标签具有class属性imdbRating。电影详情页的链接位于<a>标签中,其具有href属性。

因此,我们可以使用以下代码来获取一个电影的信息:

# 获取电影的标题、评分和详情页链接
title_column = movie.find('td', class_='titleColumn')
title = title_column.a.text
year = title_column.span.text
rating = movie.strong.text
link = title_column.a['href']
4. 提取电影详情页中的导演和类型信息

我们需要进一步访问影片详情页来获取电影的导演和类型等信息。

IMDB电影详情页具有以下链接格式:

https://www.imdb.com/<详情页ID>/

因此,我们可以使用以下代码来获取电影的详情页内容:

movie_url = 'https://www.imdb.com{}'.format(link)
response = requests.get(movie_url)
html = response.text

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

在IMDB电影详情页中,导演信息被包含在一个<div>标签中,这个标签以字符串“Director:”作为开头,并且具有class属性credit_summary_item。而类型信息被包含在一个<div>标签中,这个标签以字符串“Genres:”作为开头,并且具有class属性subtext

因此,我们可以使用以下代码来获取电影的导演和类型信息:

# 获取导演和类型信息
directors = soup.find('div', {'class': 'credit_summary_item'}).a.text
types = soup.find('div', {'class': 'subtext'}).text.strip().replace('\n', '').split('|')[0].strip()
5. 将获取的数据保存到MySQL数据库中

我们需要安装Python的MySQL数据库操作库,如mysql-connector-python。如果您还没有安装此库,可以使用以下命令安装:

$ pip install mysql-connector-python

接下来是如何将获取的电影信息保存到MySQL数据库中:

import mysql.connector

# 连接MySQL数据库
cnx = mysql.connector.connect(
    user='<MySQL用户名>',
    password='<MySQL密码>',
    host='<MySQL主机>',
    port=3306,
    database='<MySQL数据库名>',
)

# 准备MySQL数据库操作
cursor = cnx.cursor()
insert_query = ('INSERT INTO movies (title, year, rating, link, directors, types) VALUES (%s, %s, %s, %s, %s, %s)')

# 插入数据到MySQL数据库
for movie in movies:
    cursor.execute(insert_query, (movie['title'], movie['year'], movie['rating'], movie['link'], movie['directors'], movie['types']))
    cnx.commit()

# 关闭MySQL数据库连接
cursor.close()
cnx.close()
6. 从MySQL数据库中读取数据并进行分析

我们可以使用Python的pandas库和matplotlib库来加载MySQL数据库中的数据。以下是如何使用pandasmatplotlib将电影评分以饼图的形式展示出来的代码:

import mysql.connector
import pandas as pd
import matplotlib.pyplot as plt

# 连接MySQL数据库
cnx = mysql.connector.connect(
    user='<MySQL用户名>',
    password='<MySQL密码>',
    host='<MySQL主机>',
    port=3306,
    database='<MySQL数据库名>',
)

# 从MySQL数据库中读取数据
df = pd.read_sql('SELECT * FROM movies', con=cnx)

# 统计电影评分数量
rating_counts = df['rating'].value_counts()

# 绘制饼图
fig1, ax1 = plt.subplots()
ax1.pie(rating_counts.values, labels=rating_counts.index, autopct='%1.1f%%', startangle=90)
ax1.axis('equal')

# 显示饼图
plt.show()

# 关闭MySQL数据库连接
cnx.close()
总结

这就是使用Python抓取IMDB电影评分和详细信息的全部流程。如果您希望延伸这个项目,请尝试从其他电影数据库获取电影数据并进行分析,例如Douban电影。