Python爬虫——豆瓣评分8分以上电影爬取-存储-可视化分析
本文就豆瓣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分以上电影爬取-存储-可视化分析相关推荐
- 基于python的自媒体和官媒数据爬取、可视化分析及云词图制作
创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~ 1. 问题描述 为了研究自媒体和官媒的传播新闻<武汉快递小哥汪勇的先进事迹>的及时性和传播力度,对比两种传播途 ...
- 毕业设计-基于大数据的电影爬取与可视化分析系统-python
目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言
- 第一篇CSDN博客 python爬虫豆瓣排名前250的电影
## 第一篇CSDN博客 python爬虫豆瓣排名前250的电影 1.首先,这是本宝宝的第一篇博客,嘿嘿,有点小激动,之所以采用CSDN发博客呢有两个原因,1是因为现在学的东西比较多,自己学着学着就忘 ...
- Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片
Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...
- Python爬虫:最牛逼的 selenium爬取方式!
Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...
- python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取
python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...
- Python爬虫之scrapy框架360全网图片爬取
Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...
- Python爬虫实例 wallhaven网站高清壁纸爬取。
文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...
- Python爬虫系列之抖音热门视频爬取
Python爬虫系列之抖音热门视频爬取 主要使用requests库以及手机抓包工具去分析接口 该demo仅供参考,已经失效,需要抖音2019年5月最新所有接口请点击这里获取 抖音资源获取接口文档请点击 ...
最新文章
- 压缩感知 compressive sensing(转)
- Linux C编程一站式学习读书笔记——socket编程
- Hadoop源码分析-Text
- poj-1062-昂贵的聘礼
- 计算机网络原理和OSI模型与TCP模型
- CRM和ERP的Sales Organization的映射关系
- 团队-中国象棋-最终程序
- vant组件搜索并选择_Vant Weapp - 有赞出品的免费开源微信小程序组件库
- MySQL管理工具HeidiSQL
- “秃如其来”的90后,造就了一个蒸蒸日上的产业
- cocos2d-x中的尺寸之一
- 卡永久QQ飞车紫钻 记录
- 如何选型音视频即时通讯产品
- 火狐浏览器Firefox 提示错误代码:SSL_ERROR_UNSUPPORTED_VERSION的正确解决方法
- matlab英文文本信息量,实验一英文文本信息量的计算-Read.doc
- 网络文件存储系统(二)minio分布式文件系统实战
- 微信小程序云开发(2)— 云数据库
- ChatGPT智能AI对话软件
- worldmap matlab,[转载]转:matlab画地图的工具:worldmap和m_map
- 关于dva框架的二三事