【爬虫|清洗|分析】【Python】举例爬取某网站Top100电影信息并分析。

流程

爬取
输出爬取的结果为csv文件
清洗
可视化并分析

爬虫获取网页信息

登录某站官网,选中电影排行榜并通过开发者页面对网页的代码进行查找,

下面是爬取电影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部占据排行榜的 16 100 \frac{16}{100} 10016

从这可以看出,某网上的年轻人并不只是观看21世纪的电影,还会看20世纪70年代的电影,这说明年轻人并不只会关注新鲜的电影,而是更在意电影的内容。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值