本文就豆瓣8分以上电影进行爬取-存储-可视化分析。
不足之处欢迎在评论区指出讨论。
当然,如果觉得不错,要帮助的话,还请点个赞。

目录

  • 数据爬取
    • 分析网页
      • 动态网页和静态网页
    • 获取信息
    • 获得二级信息
    • 分析动态链接
  • 数据存储
    • 存储到CSV文件
    • 存储到EXCEL文件
  • 完整爬取代码
  • 数据可视化分析
    • 评分-年份
    • 类别分析
    • 出品地区分析

数据爬取

分析网页

爬取网页链接如下:
URL:https://movie.douban.com/tag/#/?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1

动态网页和静态网页

在爬取前要先分析网页是动态还是静态的。
动态网页和静态网页的最大区别是:

1.静态页面是不能随时改动的,静态是一次性bai写好放在服务器上进行浏览的,如果想改动,必须在页面上修改,然后再上传服务器覆盖原来的页面,这样才能更新信息,比较麻烦,使用者不能随时修改。

2.动态页面是可以随时改变内容的,有前后台之分,管理员可以在后台随时更新网站的内容,前台页面的内容也会随之更新,比较简单易学。

静态网页是指:

不应用程序而直接或间接制作成html的网页,这种网页的内容是固定的,修改和更新都必须要通过专用的网页制作工具,比如Dreamweaver。

动态网页是指:

使用网页脚本语言,比如php、asp、asp.net等,通过脚本将网站内容动态存储到数据库,用户访问网站是通过读取数据库来动态生成网页的方法。

网站上主要是一些框架基础,网页的内容大都存储在数据库中。

扩展资料:
动态网页:

1.所谓的动态网页,是指跟静态网页相对的一种网页编程技术。

2.静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了,除非你修改页面代码。

3.而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。

静态网页:

1.在网站设计中,纯粹HTML格式的网页通常被称为“静态网页”,早期的网站一般都是由静态网页制作的。

2.静态网页是相对于动态网页而言,是指没有后台数据库、不含程序和不可交互的网页。

3.你编的是什么它显示的就是什么、不会有任何改变。

4.静态网页相对更新起来比较麻烦,适用于一般更新较少的展示型网站。

观察网页,发现数据是动态加载的,所以这是一个动态网页,那我们就要找到真正显示电影信息的链接。

检查网页,选中Network-XHR-(ctrl+R)刷新网页。Name中出现的第一个URLhttps://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start=0就是当前页的链接,点击加载更多时,会出现下一页的URL。

获取信息

请求网页用的是Requests库(Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用)。
注意,header可通过检查网页-刷新-在header的最后找到。
观察可知,我们需要的数据就在一个JSON串里。那么只要将网页用JSON解析后,想要那个数据就可以任我们取了。
比如获得所有电影的名称:

info=r.json()
for i in range(20):print(info["data"][i]["title"])

获得二级信息

从JSON串里,我们可以获得电影的演员列表、封面、导演、评分、名称、URL,如下图所示:

那么,我们要进一步获取电影的介绍时,就可以直接通过JSON串提供的URL去到电影的详情页。这时,详情页是一个静态网页直接检查网页,如图:

电影剧情简介是不是就躺在标签里,等我们抱。上代码:

 r= requests.get(url, headers = headers)soup=BeautifulSoup(r.text,'lxml')text=soup.find('span',property='v:summary').text

值得注意的是,由于编码不同,解码译码都会出现问题。这里用到如下代码:

 text.encode("gbk",'ignore').decode("gbk","ignore")

分析动态链接

至此,对一部电影的数据爬取已经完成了,那么,怎么爬取更多数据呢?
继续分析URL。
Request URL: https://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start=0
Request URL: https://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start=20
Request URL: https://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start=40
观察可知,每一个请求里有20条数据,且URL的变化就在于star=?,而间隔就是20,那么我们要请求的链接就可以写成这样:

urls = ['https://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start={}'.format(str(i)) for i in range(0,40,20)]

如此一来,就可以访问多条数据了。

数据存储

本文中介绍了两种存储的方法。

存储到CSV文件

'''
将解析得到的内容(字典格式)逐行写入csv文件
'''
def write_dictionary_to_csv(dict,filename):file_name='{}.csv'.format(filename)with open(file_name, 'a',encoding='utf-8') as f: file_exists = os.path.isfile(filename)w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)if not file_exists :w.writeheader()w.writerow(dict)print('当前行写入csv成功!')

存储到EXCEL文件

EXCEL相比CSV就是可存储的容量更大。

'''
写入excel
将包含所有数据列表压缩为zip,并写入表格
'''
def wirte_xlsl(filename,data):#创建一个新的excel工作表work_book = xlwt.Workbook(encoding='utf-8')sheet = work_book.add_sheet('sheet1')#设置表头sheet.write(0,0,'Rate')sheet.write(0,1,'Title')sheet.write(0,2,'Directors')sheet.write(0,3,'Casts')sheet.write(0,4,'Href')sheet.write(0,5,'Summary')#将data的信息循环写入表中,注意此时行号从1开始row_num = 1for d in data:sheet.write(row_num,0,d[0])sheet.write(row_num,1,d[1])sheet.write(row_num,2,d[2])sheet.write(row_num,3,d[3])sheet.write(row_num,4,d[4])sheet.write(row_num,5,d[5])row_num += 1 #将工作表,excel文件,保存到本地路径 work_book.save(filename)

完整爬取代码

# -*- coding: utf-8 -*-'''作者:Y功能:爬取豆瓣评分8分以上电影版本:v1.0时间:2020-11-23
'''import requests
import os.path
import xlwt
import csv
from bs4 import BeautifulSoup
import jsonheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}'''
将解析得到的内容(字典格式)逐行写入csv文件
'''
def write_dictionary_to_csv(dict,filename):file_name='{}.csv'.format(filename)with open(file_name, 'a',encoding='utf-8') as f: file_exists = os.path.isfile(filename)w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)if not file_exists :w.writeheader()w.writerow(dict)print('当前行写入csv成功!')'''
写入excel
将包含所有数据列表压缩为zip,并写入表格
'''
def wirte_xlsl(filename,data):#创建一个新的excel工作表work_book = xlwt.Workbook(encoding='utf-8')sheet = work_book.add_sheet('sheet1')#设置表头sheet.write(0,0,'Rate')sheet.write(0,1,'Title')sheet.write(0,2,'Directors')sheet.write(0,3,'Casts')sheet.write(0,4,'Href')sheet.write(0,5,'Summary')#将data的信息循环写入表中,注意此时行号从1开始row_num = 1for d in data:sheet.write(row_num,0,d[0])sheet.write(row_num,1,d[1])sheet.write(row_num,2,d[2])sheet.write(row_num,3,d[3])sheet.write(row_num,4,d[4])sheet.write(row_num,5,d[5])row_num += 1 #将工作表,excel文件,保存到本地路径 work_book.save(filename)'''
获得二级数据
@return text string 电影简介
'''
def get_con2(url):r= requests.get(url, headers = headers)soup=BeautifulSoup(r.text,'lxml')text=soup.find('span',property='v:summary').textif text==None:return '无'else:return text.encode("gbk",'ignore').decode("gbk","ignore")#.encode("gbk",'ignore').decode("gbk","ignore")'''
获得一级数据
获得8分以上电影信息
'''
def get_content(urls):#write xlsl#存储listtitle=[]directors=[]rate=[]href=[]casts=[]text=[]for url in urls: r= requests.get(url, headers = headers)info=r.json()for i in range(20):title.append(info["data"][i]["title"])directors.append(info["data"][i]["directors"])rate.append(info["data"][i]["rate"])href.append(info["data"][i]["url"])text.append(get_con2(info['data'][i]['url']))casts.append(info["data"][i]["casts"])data=zip(rate,title,directors,casts,href,text)wirte_xlsl('豆瓣8分以上电影.xlsx',data)# write csv# for url in urls: #    r= requests.get(url, headers = headers)#  for i in range(20):#        title=r.json()['data'][i]['title']#        directors=r.json()['data'][i]['directors']#        rate=r.json()['data'][i]['rate']#      url=r.json()['data'][i]['url']#        casts=r.json()['data'][i]['casts']#        d={#           'Title':title,#           'Directors':directors,#           'Rate':rate,#             'Url':url,#           'Casts':casts,#       }#      print(d)#       # 逐行写入csv文件#        write_dictionary_to_csv(d,"douban8")if __name__=='__main__':urls = ['https://movie.douban.com/j/new_search_subjects?sort=U&range=8,10&tags=%E7%94%B5%E5%BD%B1&start={}'.format(str(i)) for i in range(0,40,20)]get_content(urls)print('搜索完成')

存储截图:

数据可视化分析

豆瓣电影信息不是不变的,本文仅对某一时刻爬取的40条电影数据进行分析。

data=pd.read_csv(r'豆瓣8分以上电影.csv',encoding='utf8')
df=pd.DataFrame(data)
data=data[0:40]

评分-年份

data.plot.scatter(x='year',y='rate')#散点图

观察评分-年份散点图可知,在评分在8分以上的前40部电影中,1995年期间的电影评分更高,质量较高;1995-2005评分分布在9.2上下;2010-2020的电影评分有向下滑的趋势。总的来看,大部分电影还是在9分以上。

data.hist()#直方图

分别统计出现评分、年份的次数,其直方图如下:
从直方图中可以更加明显的看出,这40部电影,评分在9.1的最多,年份在2019的最多。

data['rate'].plot()
plt.xlabel('count')
plt.ylabel('rate')
plt.title('40 movie rating')data['year'].plot()
plt.xlabel('count')
plt.ylabel('year')
plt.title('40 movie-year')



柱状图显示评分数据

plt.rcParams['figure.figsize']=[13,8]
rate=list(data.rate.unique())
rate=sorted(rate)
rate
df=pd.DataFrame(rate,columns=['rate'])
df['count']=[len(data[data['rate']==8.1]),len(data[data['rate']==8.3]),len(data[data['rate']==8.4]),len(data[data['rate']==8.5]),len(data[data['rate']==8.6]),len(data[data['rate']==8.7]),len(data[data['rate']==8.8]),len(data[data['rate']==8.9]),len(data[data['rate']==9.0]),len(data[data['rate']==9.1]),len(data[data['rate']==9.2]),len(data[data['rate']==9.3]),len(data[data['rate']==9.4]),len(data[data['rate']==9.5]),len(data[data['rate']==9.6]),len(data[data['rate']==9.7])]
df
plt.rcParams['figure.figsize']=[13,8]#这是这个表的大小
lable=df['rate'].values.tolist()#刻度标签
plt.bar(range(16),df['count'].values.tolist(),width=0.5)#14根柱子,对应值,宽度
#下面两个是x轴,y轴的表是的是啥
plt.ylabel('count',fontsize=15)
plt.xlabel("rate",fontsize=15)
#每一个柱子代表的城市
plt.xticks(range(16),lable)
plt.title('40 movie Rating')
plt.show()


该柱状图能更加清晰的看到评分数据。可见其分布也是呈橄榄球状。

plt.figure(figsize=(6,6))
label=df['rate'].values.tolist()
explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01]
plt.pie(x=df['count'].values.tolist(),explode=explode,labels=label,autopct='%1.1f%%')
plt.title('Rate')
plt.show()

饼图显示:

类别分析

type=' '.join(data['type'])#转为字符串
type=type.replace(' / ',' ')#去除多余字符
# print(type)
typelist=type.split(' ')#切割为列表
t=list(set(typelist))#去除重复项
count=[]
for i in t:count.append(typelist.count(i))#统计出现次数
plt.bar(range(len(count)),count,width=0.5)plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xticks(rotation=60)
plt.ylabel('计数',fontsize=15)
plt.xlabel('类型',fontsize=15)
plt.xticks(range(len(t)),t)
plt.title('类别喜好情况')
plt.show()


根据柱状图可以看出,剧情片最受欢迎,其次是喜剧、爱情、冒险、奇幻、动画类比较受欢迎。运动、古装、同性、歌舞类比较冷门。
附一张词云图:

df['count']=[]
type.count('剧情')
font = r'C:\Windows\Fonts\simfang.ttf'#解决中文乱码问题
wc=WordCloud(background_color='white',font_path=font, width=1400, height=1400, margin=2)
wc.generate(type)
wc.to_file("type.png")

出品地区分析


根据柱状图可以看出,美国的电影最受欢迎,其次是英国、中国、加拿大。
附一张词云图:

以上分析是否有击中你的喜好呢?不同意见欢迎在评论区讨论。
如果觉得不错,还请点个赞,感谢各位父老乡亲!

Python爬虫——豆瓣评分8分以上电影爬取-存储-可视化分析相关推荐

  1. 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作

    创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~ 1. 问题描述 为了研究自媒体和官媒的传播新闻<武汉快递小哥汪勇的先进事迹>的及时性和传播力度,对比两种传播途 ...

  2. 毕业设计-基于大数据的电影爬取与可视化分析系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

  3. 第一篇CSDN博客 python爬虫豆瓣排名前250的电影

    ## 第一篇CSDN博客 python爬虫豆瓣排名前250的电影 1.首先,这是本宝宝的第一篇博客,嘿嘿,有点小激动,之所以采用CSDN发博客呢有两个原因,1是因为现在学的东西比较多,自己学着学着就忘 ...

  4. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  5. Python爬虫:最牛逼的 selenium爬取方式!

    Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...

  6. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  7. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  8. Python爬虫实例 wallhaven网站高清壁纸爬取。

    文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...

  9. Python爬虫系列之抖音热门视频爬取

    Python爬虫系列之抖音热门视频爬取 主要使用requests库以及手机抓包工具去分析接口 该demo仅供参考,已经失效,需要抖音2019年5月最新所有接口请点击这里获取 抖音资源获取接口文档请点击 ...

最新文章

  1. 压缩感知 compressive sensing(转)
  2. Linux C编程一站式学习读书笔记——socket编程
  3. Hadoop源码分析-Text
  4. poj-1062-昂贵的聘礼
  5. 计算机网络原理和OSI模型与TCP模型
  6. CRM和ERP的Sales Organization的映射关系
  7. 团队-中国象棋-最终程序
  8. vant组件搜索并选择_Vant Weapp - 有赞出品的免费开源微信小程序组件库
  9. MySQL管理工具HeidiSQL
  10. “秃如其来”的90后,造就了一个蒸蒸日上的产业
  11. cocos2d-x中的尺寸之一
  12. 卡永久QQ飞车紫钻 记录
  13. 如何选型音视频即时通讯产品
  14. 火狐浏览器Firefox 提示错误代码:SSL_ERROR_UNSUPPORTED_VERSION的正确解决方法
  15. matlab英文文本信息量,实验一英文文本信息量的计算-Read.doc
  16. 网络文件存储系统(二)minio分布式文件系统实战
  17. 微信小程序云开发(2)— 云数据库
  18. ChatGPT智能AI对话软件
  19. worldmap matlab,[转载]转:matlab画地图的工具:worldmap和m_map
  20. 关于dva框架的二三事

热门文章

  1. 消防栓系统市场现状及未来发展趋势
  2. 携自游家逐浪新能源汽车赛道的李一男不想被同代人抛下
  3. 浏览器渲染页面的原理、回流、重绘
  4. java 数据库保存 高德地图 行政区域
  5. 移动端滚动穿透与滚动溢出解决方案
  6. 如何在页面完美显示版权符号(转)
  7. 烟草行业IT规划现状、实施及工作重点分析
  8. Python入门(第一节课)
  9. 【Pyhton 实战】---- 批量【端午节】海报下载
  10. C#练习题答案: 英雄的根【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战