仅作为参考,可能会有错误。
- 流程
- 爬虫获取网页信息
- 对爬取的数据进行数据清洗
- 对数据进行可视化与分析
流程
爬虫获取网页信息
登录某站官网,选中电影排行榜并通过开发者页面对网页的代码进行查找,
下面是爬取电影Top100信息的python代码如下(PS:User-Agent需要自己在开发者页面获取,文件保存路径需要自行更改):
# 爬取Top100电影
import bs4
import re
import urllib.request
import urllib.error
import csv
# 创建正则表达式对象
# 这里需要自行在开发者页面找到相应信息的语句。
fingTime = re.compile(r'<span class="data-box">(.*)上映',re.S) #上映时间
# 主函数
def main():
baseurl = "排行榜网址"
datalist = getData(baseurl)
savepath = "C:/Users/Desktop/电影Top100.csv"
saveData(datalist, savepath)
def getData(baseurl):
print("开始")
datalist = []
html = askURL(baseurl)
soup = bs4.BeautifulSoup(html, "html.parser")
col = ["上映时间"]
datalist.append(col)
for item in soup.find_all('div', class_="content"):
#print(item) # 测试item
data = [] # 保存一部电影的完整信息
item = str(item)
bd = re.findall(fingTime, item) #上映时间
data.append(str(bd).replace("[",'').replace("]",''))
datalist.append(data)
return datalist
# 获得一个URL的网页内容
def askURL(url):
# 模拟浏览器头部信息,向服务器发送消息(该信息需要自己获得)
print("爬取中...")
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36"}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
# print(html)
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
def saveData(datalist, savepath):
for i in range(len(datalist)):
f = open(r"你的保存路径+文件名,例:C:\Users\Desktop\电影Top100.csv",'a',newline='')
writer = csv.writer(f)
writer.writerow(datalist[i])
f.close()
print("转换csv完成")
if __name__ == "__main__":
main()
爬取后生成的csv文件如下:
对爬取的数据进行数据清洗
结果发现爬取的文件有缺失值,以及格式不对(大部分原因是爬虫部分代码写得不够好,可以自行优化代码,本文采取数据清洗的方式),接下来对数据进行数据清洗,代码如下:
import re
import csv
import pandas as pd
movies = pd.read_csv(r"C:\Users\Desktop\电影Top100.csv",encoding='gbk')
#电影数据清洗
df1 = []
col = ["上映时间"]
df1.append(col)
for i in range(0,100):
df2=[]
a = movies.loc[i]
b = a.replace(' ','').replace("'","").replace('\\n','')
df2.append(b)
a = movies.loc[i][j]
df2.append(a.replace("'",""))
#print(df2)
df1.append(df2)
for i in range(len(df1)):
f = open(r"C:\Users\Desktop\电影Top100(已清洗完毕).csv", 'a',newline='')
writer = csv.writer(f)
writer.writerow(df1[i])
f.close()
print('电影Top100数据清洗完成')
清洗完后的数据如下图,很干净,而且都为有用的信息,清洗成功!
对数据进行可视化与分析
接下来我们读取清洗完毕后的数据,并将上映时间提取出来(也可以充分利用所有的字段,例如可以做成数字化大屏等等),统计该年份电影上映的数量,代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import re
import jieba
movies = pd.read_csv(r"C:\Users\Desktop\电影Top100(已清洗完毕).csv",encoding='gbk')
time = []
for i in range(len(movies['上映时间'])):
time1 = movies['上映时间'][i].split('-')[0]
time.append(time1)
Time = []
for i in time:
if i not in Time:
Time.append(i)
print(Time)
Time = sorted(Time)
Time_time = []
for i in Time:
Time_time.append(time.count(i))
print(Time_time)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False # 解决中文显示问题
plt.bar(Time, Time_time, 0.6, label='电影数量', color='#87CEFA')
plt.legend() #显示图例
plt.xlabel('上映年份') #x轴标签
plt.ylabel('电影数量') #y轴标签
plt.title('各年份电影直方图') #标题
生成的直方图如图所示:
分析结果:
从图中可以看出,电影上映的年份最早是在1972年,最新的年份是在2022年;而观看的电影数量最多的一年是2021年,总共有16部,占据排行榜的。
从这可以看出,某网上的年轻人并不只是观看21世纪的电影,还会看20世纪70年代的电影,这说明年轻人并不只会关注新鲜的电影,而是更在意电影的内容。