1. 项目概述
目标:通过编写Python程序自动抓取豆瓣电影Top 250的数据,之后使用可视化技术对这些数据进行深入分析,最后将分析结果以直观的方式展示出来。
意义:
- 了解当前市场上最受欢迎的电影及其特征。
- 分析观众对于不同类型电影的喜好趋势。
- 提供给观众,方便观众了解电影质量并做出观影选择
- 提供给影视制作方参考,辅助决策。
2.数据收集
目标网站:豆瓣电影 Top 250
注意事项:如个人实现时发现自己写的代码语法错误,请调试至正确后再运行,避免在短时间内大量进行爬取,给服务器带来负担(状态码会变成403,只有状态码等于200时,爬虫才能进行)
检查和网络如下图(检查是左边第一个图标)
import os
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup
import csv
#设置请求头,模拟浏览器行为,避免被服务器拒绝
#网页中右键检查,点击顶上的网络(附图在上方),刷新之后出现的内容随便点击一样,拖动出现变化的页面到最下方就能看见自己的User-Agent
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
#初始化数据列表
title=[]
year=[]
score=[]
type=[]
review=[]
director=[]
#循环遍历所有页面
for star_num in range(0,250,25):#总共250部电影,每页25部电影
response=requests.get(f"https://movie.douban.com/top250?start={star_num}",headers=headers)#f-string,格式化字符串字面量,允许在字符串中嵌入表达式
if response.status_code==200:#响应体正常
print(f'Page {star_num // 25 + 1} Ok')
else:
print(response.status_code)#返回状态码,查看具体异常原因
html=response.text
soup=BeautifulSoup(html,'html.parser')
#找到所有电影的条目,一个条目对应一部电影
#右键,检查,检查,点击自己想要获取的页面元素,可以得到对应的html结构。以下提取部分根据网页对应结构编写,不止一种方法。
item=soup.findAll('div',class_='item')#与python中class区分
for movie in item:
# 提取标题
title.append(movie.find('span',class_='title').text)
#提取年份
year.append(re.findall('\d+',movie.find('p').text)[0])
#提取评分
score.append(movie.find('span',class_='rating_num').text)
#提取类型
type.append(movie.find('div',class_='bd').find('p').text.split('/')[-1].split(';')[-1].split())
#提取评论数
review.append(re.findall('\d+',movie.find('div',class_='star').text)[-1])
#提取导演
director.append(movie.find('div',class_='bd').find('p').text.split('/')[0].split(':')[1].split(';')[0].split('\xa0')[0])
print('title:',title)#查看获取元素是否是自己想要的元素
print('year:',year)
print('score:',score)
print('type:',type)
print('review:',review)
print('director',director)
#构建输出路径
out_path='./douban250.csv'
#创建电影信息字典
film_dict={
'title':title,
'year':year,
'score':score,
'type':type,
'review':review,
'director':director
}
film_250=pd.DataFrame(film_dict)
if os.path.exists(out_path):#如果该地址存在文件就读取文