Python爬取⾖瓣电影信息并分析
Python爬取⾖瓣电影信息并分析
⼀个数据分析的作业0.0
不知道怎么爬取⾖瓣所有的电影信息,所以只能从⼀些榜单中爬取,如果是所有电影,效果应该会好很多。。。
爬取⾖瓣⾼分电影榜电影信息并分析
总共784部电影
⼀、爬取⾖瓣⾼分电影
1.先查看⽹页源代码
到存放电影信息的代码:
class=‘title’的div标签⽂本中存放着电影名称
class=‘rating’的div标签中存放着星级,评分和评价⼈数
class=‘abstract’的div标签中存放着导演,主演,类型,制⽚国家/地区和年份的信息
根据上述获得的信息即可进⾏爬⾍
2.编写代码
使⽤requests库获取页⾯信息,使⽤BeautifulSoup解析获取的html代码,当然也可以直接⽤正则表达式解析html代码定义get_movies()⽅法,返回电影的名字,类型,评论⼈数,评分,制⽚国家/地区,主演,导演,年份的7个列表
其中年份按照⼏⼏年划分到xx世纪xx年代
import re
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_movies(link):
headers ={# 这是请求头
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/83.0.4103.116 Safari/537.36 '
}
movie_names=[]
movie_types=[]
movie_dis=[]
movie_grade=[]
movie_addr=[]
movie_actor=[]
movie_director=[]
movie_year=[]
(link,headers=headers,timeout=10)
soup=,"lxml")
for each in soup.find_all('div',class_='abstract'):
#.匹配任意字符,除了换⾏符
tp = re.search(r'类型: (.*)',a)
if tp==None:
movie_types.append(" ")
else:
movie_types.up(1))
actor = re.search(r'主演: (.*)',a)
if actor==None:
movie_actor.append(" ")
else:
movie_actor.up(1))
director = re.search(r'导演: (.*)',a)
if director==None:
movie_director.append(" ")
电影源代码人物介绍else:
movie_director.up(1))
addr = re.search(r'制⽚国家/地区: (.*)',a)
if addr==None:
movie_addr.append(" ")
else:
movie_addr.up(1))
year=re.search(r'年份: (.*)',a)
if year==None:
movie_year.append(" ")
else:
year_up(1)
sj=int(year_str[:2])+1
nd=year_str[2]+'0'
movie_year.append(str(sj)+'世纪'+nd+'年代')
#查询所有class=title的div
div_list=soup.find_all('div',class_='title')
for each in div_list:
movie_name=strip()# 在div中,a标签的text的内容就是中⽂电影名称
movie_names.append(movie_name)
for each in soup.find_all('div',class_='rating'):
split('\n')#在div中,第三个span的text的内容就是评价⼈数
#获取字符串中的数字
x=re.sub("\D","",a[3])
movie_dis.append(int(x))
movie_grade.append(float(a[2]))
return movie_names,movie_types,movie_dis,movie_grade,movie_addr,movie_actor,movie_director,movie_year
⽤for 循环读取每页的数据并写⼊dataframe
movies=get_movies("www.douban/doulist/240962/")
movies_1=pd.DataFrame({'电影名称':movies[0],'电影类型':movies[1],'导演':movies[6],'主演':movies[5],'评价⼈数':movies[2],'评分':movies[3],'国家/地区':movi es[4],'年代':movies[7]})
for i in range(1,18):
#总共18页,⼀页25个
link="www.douban/doulist/240962/?start="+str(i*25)
movies=get_movies(link)
movies_1=movies_1.append(pd.DataFrame({'电影名称':movies[0],'电影类型':movies[1],'导演':movies[6],'主演':movies[5],'评价⼈数':movies[2],'评分':movie s[3],'国家/地区':movies[4],'年代':movies[7]}),ignore_index=True)
all_movies=movies_1
总共读取三个⽹页的电影信息,操作类似
整合所有数据后的到
⼆、数据分析
⾸先把年份的列名改成year
统计每个年代上榜影⽚数量,并⽤plotly绘制柱状图
⾸先要导⼊相关库
press as px
aph_objects as go
upby('year').count()
x=list(n.index)
y=list(n['评分'])
fig = go.Figure()
fig.add_trace(go.Bar(
x=x,
y=y,
))
plotly可以⽤以下⽅法下载图⽚
import plotly.io as pio
pio.write_image(fig,'1.png')
评分和评价⼈数
这⾥需要标准化数据,使他们落在⼀个区间
upby('year')['评价⼈数','评分'].mean()
s=(an())/x.std()
fig = px.line(s)
fig.show()
20世纪早期的电影观看⼈数较少,但评分普遍较⾼,了20世纪中期之后的电影观看⼈数开始增加,但评分却略显平庸,到了本世纪,评分才有了上涨的趋势。
统计所有上榜电影类型
⾸先将电影类型按照 ‘/’ 分割,并去空格,转化成list 的⽬的是使⽤collections.Counter
先导⼊
from collections import Counter
types=data['电影类型'].str.split('/')
l=[]
tl=[]
for i in range(783):
for i in l:
tl.append(i.strip())
c = Counter(tl)
k=list(c.keys())
v=list(c.values())
count=pd.DataFrame({'type':k,'c':v})
count.sort_values(by='c')
total=count
绘制饼图
fig = px.pie(total, values='c', names='type')
fig.show()
剧情这⼀类型涵盖的⽅⾯实在是太⼴了,所以剧情占⼤头,其次就是爱情和喜剧了。每个年代电影类型占⽐的统计
⽤以下⽅法筛选出每个年代的电影
data_y=ar==year]
再按照之前的⽅法进⾏统计
并计算出每个年代各个类型出现的概率,画出柱状图
其中x是所有电影类型的列表
y是该年代各个电影类型的占⽐
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论