📅  最后修改于: 2023-12-03 14:49:50.492000             🧑  作者: Mango
如今,随着互联网的发展,人们在选择一部电影去观看时,更倾向于查看电影评分和详细信息。而IMDB作为全球最大的电影数据库之一,它的电影评分和详细信息自然成为很多人的首选。
那么,如何使用Python抓取IMDB电影评分和详细信息呢?接下来,我们将为您介绍一种较为简便的方法。
我们的思路是通过爬虫程序获取IMDB电影主页上的电影评分、电影名称、电影导演、电影类型等相关信息,把这些数据保存到MySQL数据库中,再通过Python程序从数据库中读取数据并进行分析。
我们需要安装以下两个Python库:
如下所示是两个库的安装方法(假设已经安装好了pip):
$ pip install requests
$ pip install beautifulsoup4
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')
我们需要用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']
我们需要进一步访问影片详情页来获取电影的导演和类型等信息。
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()
我们需要安装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()
我们可以使用Python的pandas
库和matplotlib
库来加载MySQL数据库中的数据。以下是如何使用pandas
和matplotlib
将电影评分以饼图的形式展示出来的代码:
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电影。