admin管理员组

文章数量:1435859

【爬虫

仅作为参考,可能会有错误。

  • 流程
  • 爬虫获取网页信息
  • 对爬取的数据进行数据清洗
  • 对数据进行可视化与分析

流程

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

爬虫获取网页信息

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

下面是爬取电影Top100信息的python代码如下(PS:User-Agent需要自己在开发者页面获取,文件保存路径需要自行更改):

# 爬取Top100电影
import bs4
import re
import urllib.request
import urllib.error
import csv# 创建正则表达式对象
# 这里需要自行在开发者页面找到相应信息的语句。
fingTime = repile(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)    # 测试itemdata = []        # 保存一部电影的完整信息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 htmldef 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 pdmovies = 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 jiebamovies = 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年代的电影,这说明年轻人并不只会关注新鲜的电影,而是更在意电影的内容。

本文标签: 爬虫