豆瓣电影TOP250数据规律分析
1 概述
1.1 研究背景与目标
豆瓣电影网对世界知名电影都进行了排行,主要是根据观众们对这部电影的评价的高低来对电影进行等级排序,而我想观测电影的评价分数和评价人数两者那个对电影的等级影响更大。豆瓣用户每天都在对“看过”的电影进行“很差”到“力荐”的评价,豆瓣根据每部影片看过的人数以及该影片所得的评价等综合数据,通过算法分析产生豆瓣电影 Top 250。
1.2 研究内容与意义
本文对于"好评电影"(豆瓣电影top250)的影片评分,上映时间,评论人数,制作国家,电影类型,影片描述进行分析,期望为渴望寻找 优秀影片的观影者 以及电影制片方对电影的选择提供若干参考建议。
2 研究方案
2.1 研究思路
第一步:观察目标网址URL特点,建立URL
第二步:访问URL
第三步:爬取数据
第四步:存储数据
2.2 算法流程图
3 设计与实现
3.1 准备工作
第三方库 bs4、urllib、re、xlwt
3.2 打开网页
3.3 分析网页
查看每一页网页的url,分析它的规律
可以看出,从第二页开始,URL不同的都是’start='后面这个数,并且基数都为25。
3.4 爬取网页
要爬取网页内容,我们的主要思路就是模拟浏览器访问网页,网页内容都隐藏在网页代码中,成功访问到网页以后,我们需要对网页的有用信息进行查找,筛选,得到自己需要的数据。
观察网页源代码(快捷键:F12),可以看出每一个
从中找到自己所需信息后,利用正则表达式进行网页内容提取:
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10):
url =baseurl + str(i*25)
html = askURL(url)
#2.逐一解析
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
#print(item)#测试查看电影item全部信息。
data=[]
item = str(item)
link = re.findall(findlink,item)[0]
data.append(link)
imgSrc = re.findall(findImgSrc,item)[0]
data.append(imgSrc)
titles = re.findall(findtitle,item)
if(len(titles)==2):
ctitle = titles[0]
data.append(ctitle)
otitle = titles[1].replace("/","")
data.append(otitle)
else:
data.append(titles[0])
data.append('')
reting =re.findall(findRating,item)[0]
data.append(reting)
judgeNum = re.findall(findJudge,item)[0]
data.append(judgeNum)
inq = re.findall(findInq,item)
if(len(inq)!=0):
inq = inq[0].replace("。","")
data.append(inq)
else:
data.append("")
bd = re.findall(findBd,item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)
bd = re.sub('/'," ",bd)
data.append(bd.strip())
datalist.append(data)
print(datalist)
return datalist
#得到指定网站url内容
def askURL(url):
head = {
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 84.0.4147.89Safari / 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
3.5 保存网页数据并筛选
保存到excel表格(通过xlwt模块):
分为创建对象、创建工作表、保存等三步。
#保存网页数据
def saveData(datalist,savepath):
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
sheet = book.add_sheet('豆瓣电影TOP250',cell_overwrite_ok=True)
col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评分数","概况","相关信息")
for i in range(0,8):
sheet.write(0,i,col[i])
for i in range(0,250):
print("第%d条"%(i+1))
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
book.save(savepath)
if __name__== "__main__":
main()
保存到Sqlite3数据库:
分为创建数据表、连接、获得游标(指针)、语句执行、提交、关闭数据库等步骤。
def saveData2DB(datalist, dbpath):
print("Sqlite saveing...")
init_db(dbpath)
conn = sqlite3.connect(dbpath)
cur = conn.cursor()
# cur.execute()
for data in datalist:
for index in range(len(data)):
if index == 4 or index == 5:
continue
data[index] = '"' + data[index] + '"'
sql = '''
insert into movie250(info_link,pic_link,cname,ename,score,rated,instroduction,info)
values(%s)''' % ",".join(data)
# print(sql)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
def init_db(dbpath):
sql = '''
create table if not exists movie250
(
id integer primary key autoincrement,
info_link text,
pic_link text,
cname varchar,
ename varchar,
score numeric,
rated numeric,
instroduction text,
info text
)
''' # 创建数据表 drop table if exists movie250
conn = sqlite3.connect(dbpath)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
3.6 查看结果
最终保存的文件,会直接保存在我们一开始所创建的文件夹中,格式为xls工作表
主程序调用上面所包装的一个个函数,逐一进行访问、提取、保存。
def main():
baseurl = "https://movie.douban.com/top250?start="
# 1.爬取网页
datalist = getDate(baseurl)
# 3.1 保存数据到excle表格中;或者 r“.\”;保存在excle中
savepath = "豆瓣电影Top250.xls"
saveData(datalist, savepath)
print(">>表格保存完毕")
# 3.2 保存到数据库中
dbpath = "movie.db"
saveData2DB(datalist, dbpath)
print(">>数据库保存完毕")
# askURL("https://movie.douban.com/top250?start=0")
# askURL("https: //baidu.com")
if __name__ == "__main__": # 当程序执行时
# 调用函数
main()
print(">>爬取完毕")
# init_db("movietest.db")
# print("数据库创建完成")
4 数据可视化
4.1 数据分析与数据可视化
以做一个条形图为例
分析哪个国家在电影top250的榜单中出现的最多
df = pd.read_excel(“C:/Users/tanweiming/workspace/dsc/work/d.xlsx”,sheet_name= “Sheet1”)
k = df[‘发行国家’].value_counts().reset_index()[‘index’].to_list()
g = df[‘发行国家’].value_counts().reset_index()[‘发行国家’].to_list()
length = len(k)
a=0
i=10
sum=0
list=[]
b=[]
for a in range(i):
list.append(k[a])
b.append(g[a])
list.append(‘其他’)
for i in range(10,length):
p=g[i]
sum=sum+p
b.append(sum)
def bar_base(x,y) -> Bar:
c = (
Bar()
.add_xaxis(x)
.add_yaxis(“出现次数”,y)
.set_global_opts(title_opts=opts.TitleOpts(title=“国家占比图”),xaxis_opts=opts.AxisOpts(name=“国家”))
)
return c.render(“条形图.html”)
bar_base(list,b)
得出的效果如图:
折线图
饼状图
#Rating pie
Rating=Movie['rating_num']
bins=[8,8.5,9,9.5,10] #分区(0,8],(8,8.5]....
rat_cut=pd.cut(Rating,bins=bins)
rat_class=rat_cut.value_counts() #统计区间个数
rat_pct=rat_class/rat_class.sum()*100 #计算百分比
rat_arr_pct=np.array(rat_pct)#将series格式转成array,为了避免pie中出现name
f1=plt.figure(figsize=(9,9))
plt.title('DoubanMovieTop250\nRatingDistributin(0~10)')
plt.pie(rat_arr_pct,labels=rat_pct.index,colors=['r','g','b','c'],autopct='%.2f%%',startangle=75,explode=[0.05]*4) #autopct属性显示百分比的值
plt.savefig('MovieTop250.RatingDistributin(0~10).png')
f1.show()
#explode:将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
#shadow,饼是否有阴影
#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#pctdistance,百分比的text离圆心的距离
#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
5 结束语
本文根据网站的特点,设计了一种基于python中requests模块进行影评采集的爬虫程序,可进行豆瓣网中大量影评信息。通过上述方法,实现了豆瓣网大量影评信息的抓取。在具体实践过程中,可将爬虫部署到云主机,不间断地抓取数据,随时使用主机中提取。网络的发展,使爬虫获取数据已经成为一种常用手段。通过该方法不仅可以抓取影评信息,只要稍加修改就可以抓取其他数据。
参考文献
[1]郭丽蓉,基于Python的网络爬虫程序设计[J].电子技术与软件工程2017,(12)
[2]网络爬虫. https: //baike. baidu.com/item/网络爬虫.
[3]白雪丽,浅析基于Python爬虫技术的特性及应用[J].山西科技,2018,33(2)
[4]王锦阳,主题网络爬虫的并行化研究与设计[D].成都:西南石油大学,2017.
[5]夏火松,李保国,基于Python的动态网页评价爬虫算法[J],软件工程,2016,19 (2 )
[6]詹恒飞,杨岳湘,方宏Nutch分布式网络爬虫研究与优化[J],计算机科学与探索,2011(1).
[7]李纪欣,王康,周立发,等Google Protobuf在Linux Socket通讯中的应用[J],电脑开发与应用,2013(4).
[8]Critical Tokenization and its Properties,郭进,新加坡国际大学
[9]基于本体的语义检索技术,陈永,林世平,福州大学,数学与计算机科学学院
[10]基于领域共享本体的 RDF 语义查询,唐蕾,宋自林
附录
from bs4 import BeautifulSoup
import re
import urllib.request,urllib.error
import xlwt
import sqlite3
def main():
baseurl = "https://movie.douban.com/top250?start="
#1.爬取网页
datalist = getData(baseurl)
savepath = "豆瓣电影Top250.xls"
#3.保存数据
saveData(datalist,savepath)
#askURL("https://movie.douban.com/top250?start=")
findlink = re.compile(r'<a href="(.*?)">')#影片详情链接
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)#让换行符包含在字符中 #影片图片链接
findtitle = re.compile(r'<span class="title">(.*)</span>')#影片片名
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')#影片评分
findJudge = re.compile(r'<span>(\d*)人评价</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10):
url =baseurl + str(i*25)
html = askURL(url)
#2.逐一解析
soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="item"):
#print(item)#测试查看电影item全部信息。
data=[]
item = str(item)
link = re.findall(findlink,item)[0]
data.append(link)
imgSrc = re.findall(findImgSrc,item)[0]
data.append(imgSrc)
titles = re.findall(findtitle,item)
if(len(titles)==2):
ctitle = titles[0]
data.append(ctitle)
otitle = titles[1].replace("/","")
data.append(otitle)
else:
data.append(titles[0])
data.append('')
reting =re.findall(findRating,item)[0]
data.append(reting)
judgeNum = re.findall(findJudge,item)[0]
data.append(judgeNum)
inq = re.findall(findInq,item)
if(len(inq)!=0):
inq = inq[0].replace("。","")
data.append(inq)
else:
data.append("")
bd = re.findall(findBd,item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)
bd = re.sub('/'," ",bd)
data.append(bd.strip())
datalist.append(data)
print(datalist)
return datalist
#得到指定网站url内容
def askURL(url):
head = {
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 84.0.4147.89Safari / 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):
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
sheet = book.add_sheet('豆瓣电影TOP250',cell_overwrite_ok=True)
col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评分数","概况","相关信息")
for i in range(0,8):
sheet.write(0,i,col[i])
for i in range(0,250):
print("第%d条"%(i+1))
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
book.save(savepath)
if __name__== "__main__":
main()
豆瓣电影TOP250数据规律分析相关推荐
- python爬取豆瓣电影top250并保存为xlsx_python抓取豆瓣电影Top250数据并写入Excel
douban python抓取豆瓣电影Top250数据并写入Excel 1.将目标网站上的页面抓取下来 2.将抓取下来的数据根据一定的规则进行提取 create table `tb_movie`( i ...
- Python爬虫实战,pyecharts模块,Python实现豆瓣电影TOP250数据可视化
前言 利用Python实现豆瓣电影TOP250数据可视化.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pandas模块 pyecharts模块: 以及一些 ...
- 豆瓣电影TOP250爬虫及可视化分析笔记
人类社会已经进入大数据时代,大数据深刻改变着我们的工作和生活.随着互联网.移动互联网.社交网络等的迅猛发展,各种数量庞大.种类繁多.随时随地产生和更新的大数据,蕴含着前所未有的社会价值和商业价值! ...
- 基于Hadoop的豆瓣电影的数据抓取、数据清洗、大数据分析(hdfs、flume、hive、mysql等)、大屏可视化
目录 项目介绍 研究背景 国内外研究现状分析 研究目的 研究意义 研究总体设计 数据获取 网络爬虫介绍 豆瓣电影数据的采集 数据预处理 数据导入及环境配置 Flume介绍 Hive介绍 MySQL介绍 ...
- python爬虫实战—豆瓣电影TOP250
系列文章目录 python爬虫实战 前言 本文主要用python爬取豆瓣电影TOP250数据并将爬取到的数据保存到MySQL中.同时也介绍了该项目中遇到的问题. 爬取内容:电影名称,电影别名,导演,主 ...
- python 豆瓣评论数据分析_Python数据可视化分析--豆瓣电影Top250
Python数据分析–豆瓣电影Top250 利用Python爬取豆瓣电影TOP250并进行数据分析,对于众多爬虫爱好者,应该并不陌生.很多人都会以此作为第一个练手的小项目.当然这也多亏了豆瓣的包容,没 ...
- python爬取豆瓣电影并分析_爬取豆瓣电影top250提取电影分类进行数据分析
标签(空格分隔):python爬虫 一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250 页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入 ...
- 对豆瓣电影Top250榜单的一些探索性分析
业余打发时间看电影是个不错的选择,但是如果看了一部无聊糟心的电影就得不偿失了,所以一些电影方面的榜单就出现了,可以为这些选择困难患者提供一个不错的指南,那些是经典是值得看的,而那些电影不值得你浪费一两 ...
- python爬取豆瓣电影top250_用Python爬取豆瓣电影TOP250分析
/ 01 / Scrapy 之前了解了pyspider框架的使用,但是就它而言,只能应用于一些简单的爬取. 对于反爬程度高的网站,它就显得力不从心. 那么就轮到Scrapy上场了,目前Python中使 ...
最新文章
- org.apache.hadoop.fs-ChecksumException
- 站在架构师的角度,深入理解 MySQL!
- 编译时异常和运行时异常的区别
- Arduino/Microduino与OneNet平台及web服务器端的交互
- 字符串转整数,不使用任何C语言库函数
- linux录音命令,安装Linux 录音软件 Record Audio
- 影响 5000 万开发者,GitHub 与 CSDN 掌舵人对话技术社区未来
- leetcode 85. Maximal Rectangle
- EXCEL【数据处理之数据清洗——重复数据处理】
- 【论文阅读】自然语言模型的尺度法则(CS224N WINTER 2022 Lecture17 推荐阅读整理)
- ps图层高级扩展知识
- lnmp 一键安装包 运行laravel 该网页无法正常运行
- 图解网络硬件 资料分享
- FPGA入门实验-基于状态机实现4位共阴极数码管显示超声波模块读数
- 基于c#条码打印软件源代码 可选择打印机,可选择标签
- HDU 2276 Kiki Little Kiki 2
- python里defoults_Python Part.Compound方法代码示例
- python 模拟浏览器selenium_从零开始写Python爬虫 --- 3.1 Selenium模拟浏览器
- 如何一下清空微信好友_怎么一次性删除微信朋友圈说说
- 百度云破解限速浏览器下载