app开发定制公司用Python爬取豆瓣电影Top250并进行数据可视化分析

app开发定制公司今天我们小组合作使用Pythonapp开发定制公司爬取豆瓣电影Top250app开发定制公司获取电影详情链接,图片链接,app开发定制公司影片中文名、app开发定制公司影片外国名、评分、评价数,app开发定制公司概况以及相关信息。

第一部分:爬取部分

app开发定制公司使用到的库

  1. import os #打开文件,处理文件
  2. from bs4 import BeautifulSoup #网页解析,获取数据
  3. import re #正则表达式库
  4. import xlwt #进行excel操作
  5. import urllib.request,urllib.error #指定url,获取网页数据

将相关的库进行安装后使用。

进行网页的分析

通过对网页的观察我发现

第一页:https://movie.douban.com/top250?start=0&filter=
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
第十页:https://movie.douban.com/top250?start=225&filter=

所以我们可以用for循环进行遍历处理。

  1. def getDate(baseurl):
  2. datalist = []
  3. x = 1
  4. #调用获取页面信息的函数(10次)
  5. for i in range(0,10):
  6. url = baseurl + str(i*25)
  7. html = askURL(url) #保存获取到的网页源码
  8. #逐一解析数据
  9. soup = BeautifulSoup(html, "html.parser")
  10. for item in soup.find_all('div', class_="item"):
  11. data = [] #保存一部电影的所有信息
  12. item = str(item) #将item转换为字符串
  13. #影片详情链接
  14. link = re.findall(findLink, item)[0]
  15. #追加内容到列表
  16. data.append(link)
  17. imgSrc = re.findall(findImgSrc, item)[0]
  18. data.append(imgSrc)
  19. titles = re.findall(findTitle, item)
  20. if (len(titles) == 2 ):
  21. ctitle = titles[0]
  22. data.append(ctitle) #添加中文名
  23. otitle = titles[1].replace("/", "")
  24. data.append(otitle) #添加外国名
  25. else:
  26. data.append(titles[0])
  27. data.append(' ') #外国名如果没有则留空
  28. rating = re.findall(findRating,item)[0]
  29. data.append(rating)
  30. judgeNum = re.findall(findJudge, item)[0]
  31. data.append(judgeNum)
  32. inq = re.findall(findInq, item)
  33. if len(inq) != 0 :
  34. inq = inq[0].replace("。", "")
  35. data.append(inq)
  36. else:
  37. data.append(' ')
  38. bd = re.findall(findBd,item)[0]
  39. bd = re.sub('<br(\s+)?/>(\s+)?'," ", bd)
  40. bd = re.sub('/', " ", bd)
  41. data.append(bd.strip())
  42. datalist.append(data) #把处理好的一部电影信息放入datalist
  43. #print(link)
  44. # 下载图片到本地
  45. root = "C://Users/DELL/Desktop/新建文件夹/tupian//"#这里是图片下载保存的路径
  46. path = root + str(x) + '.jpg'
  47. try:
  48. if not os.path.exists(root):
  49. os.mkdir(root)
  50. if not os.path.exists(path):
  51. #r = requests.get(imgSrc, headers=head)
  52. urllib.request.urlretrieve(imgSrc,path)
  53. #with open(path, 'wb') as f:
  54. # f.write(r.content)
  55. # f.close()
  56. print("下载第%d部电影封面"%(x))
  57. x += 1
  58. else:
  59. print("文件保存成功")
  60. except:
  61. print("下载失败")
  62. return datalist

保存数据存入Excel

首先使用xlwt库进行Excel的操作然后存入数据。

  1. def saveData(datalist, savepath):
  2. book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
  3. sheet = book.add_sheet("豆瓣电影Top250",cell_overwrite_ok=True) # 创建工作表
  4. col = ('电影详情链接',"图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")#定义元组
  5. try:
  6. for i in range(0,8):
  7. sheet.write(0,i,col[i]) #输入列名
  8. for i in range(0,250):
  9. print("第%d条" %(i+1))
  10. data = datalist[i]
  11. for j in range(0,8):
  12. sheet.write(i+1,j,data[j])
  13. book.save(savepath)
  14. except:
  15. print("爬取异常")
  16. if __name__ == '__main__':
  17. main()
  18. print("爬取完毕")

 第二部分:分析部分以及词云的生成

使用的库有

  1. import pandas as pd #解决数据分析任务
  2. from pyecharts.charts import Bar #画柱形图
  3. import matplotlib.pyplot as plt #绘制图形
  4. import collections # 词频统计库
  5. import numpy as np #矩阵操作
  6. import jieba #词频统计库
  7. import wordcloud #词云库

我们这里统计了评分前25名电影的评价数,部分代码如下:

  1. data = pd.read_excel('豆瓣电影Top250.xls') #首先读取Excel数据文档
  2. df = data.sort_values('评分',ascending=False).head(25)
  3. v = df['影片中文名'].values.tolist() #tolist()将数据转换为列表形式
  4. d = df['评分'].values.tolist()
  5. bar = (
  6. Bar()
  7. .add_xaxis([i for i in df['影片中文名'].values.tolist()])
  8. .add_yaxis('评分前25名', df['评价数'].values.tolist())
  9. )
  10. bar.render("./条形图.html")
  11. print("柱形图保存成功!")

然后进行词云生成

读取文件

  1. fn = open('top250.txt','r',encoding='utf-8')
  2. string_data = fn.read()
  3. fn.close()

统计相关信息中出现次数前十进行词云生成

  1. seg_list_exact = jieba.cut(string_data, cut_all = False) # 精确模式分词
  2. object_list = []
  3. remove_words = [u'19', u',',u'20', u'德国', u'导演', u'日本', u'法国',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
  4. u'20',u'大陆',u'我们',u'美国'] # 自定义去除词库
  5. for word in seg_list_exact: # 循环读出每个分词
  6. if word not in remove_words: # 如果不在去除词库中
  7. object_list.append(word) # 分词追加到列表

最后是词频展示

  1. # 词频展示
  2. mask = np.array(Image.open('image.jpg'))
  3. wc = wordcloud.WordCloud(
  4. font_path='simfang.ttf',
  5. mask=mask,
  6. max_words=100, # 最多显示词数
  7. max_font_size=150, # 字体最大值
  8. background_color='white',
  9. width=800, height=600,
  10. )

效果图:

最后完整代码

  1. #-*- coding = utf-8 -*-
  2. # 声明编码方式
  3. import os
  4. from bs4 import BeautifulSoup #网页解析,获取数据
  5. import re
  6. import xlwt #进行excel操作
  7. import urllib.request,urllib.error #指定url,获取网页数据
  8. import pandas as pd
  9. from pyecharts.charts import Bar #画柱形图
  10. import matplotlib.pyplot as plt
  11. import numpy as np
  12. import jieba
  13. import wordcloud
  14. def main():
  15. baseurl = "https://movie.douban.com/top250?start="
  16. #获取网页
  17. datalist = getDate(baseurl)
  18. savepath = ".\\豆瓣电影Top250.xls"#我的是".\\豆瓣电影Top250.xls"
  19. #保存数据
  20. saveData(datalist, savepath)
  21. head = {
  22. "User-Agent":"Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.121Safari / 537.36"
  23. }#用户代理:表示告诉豆瓣服务器是什么类型的浏览器(本质上是告诉浏览器可接收什么类型的文件)
  24. #影片详情链接规则
  25. findLink = re.compile(r'<a href="(.*?)">') #创建正则表达式对象
  26. #影片图片的链接
  27. findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
  28. #影片片名
  29. findTitle = re.compile(r'<span class="title">(.*)</span>')
  30. #影片评分
  31. findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  32. #评价人数
  33. findJudge = re.compile(r'<span>(\d*)人评价</span>')
  34. #概况
  35. findInq = re.compile(r'<span class="inq">(.*)</span>')
  36. #找到影片的相关内容
  37. findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
  38. #爬取网页
  39. def getDate(baseurl):
  40. datalist = []
  41. x = 1
  42. #调用获取页面信息的函数(10次)
  43. for i in range(0,10):
  44. url = baseurl + str(i*25)
  45. html = askURL(url) #保存获取到的网页源码
  46. #逐一解析数据
  47. soup = BeautifulSoup(html, "html.parser")
  48. for item in soup.find_all('div', class_="item"):
  49. data = [] #保存一部电影的所有信息
  50. item = str(item) #将item转换为字符串
  51. #影片详情链接
  52. link = re.findall(findLink, item)[0]
  53. #追加内容到列表
  54. data.append(link)
  55. imgSrc = re.findall(findImgSrc, item)[0]
  56. data.append(imgSrc)
  57. titles = re.findall(findTitle, item)
  58. if (len(titles) == 2 ):
  59. ctitle = titles[0]
  60. data.append(ctitle) #添加中文名
  61. otitle = titles[1].replace("/", "")
  62. data.append(otitle) #添加外国名
  63. else:
  64. data.append(titles[0])
  65. data.append(' ') #外国名如果没有则留空
  66. rating = re.findall(findRating,item)[0]
  67. data.append(rating)
  68. judgeNum = re.findall(findJudge, item)[0]
  69. data.append(judgeNum)
  70. inq = re.findall(findInq, item)
  71. if len(inq) != 0 :
  72. inq = inq[0].replace("。", "")
  73. data.append(inq)
  74. else:
  75. data.append(' ')
  76. bd = re.findall(findBd,item)[0]
  77. bd = re.sub('<br(\s+)?/>(\s+)?'," ", bd)
  78. bd = re.sub('/', " ", bd)
  79. data.append(bd.strip())
  80. datalist.append(data) #把处理好的一部电影信息放入datalist
  81. #print(link)
  82. # 下载图片到本地
  83. root = "C://Users/DELL/Desktop/新建文件夹/tupian//"#我的是"E://DoubanPic//"
  84. path = root + str(x) + '.jpg'
  85. try:
  86. if not os.path.exists(root):
  87. os.mkdir(root)
  88. if not os.path.exists(path):
  89. #r = requests.get(imgSrc, headers=head)
  90. urllib.request.urlretrieve(imgSrc,path)
  91. #with open(path, 'wb') as f:
  92. # f.write(r.content)
  93. # f.close()
  94. print("下载第%d部电影封面"%(x))
  95. x += 1
  96. else:
  97. print("文件保存成功")
  98. except:
  99. print("下载失败")
  100. return datalist
  101. #得到指定一个url的网页内容
  102. def askURL(url):
  103. request = urllib.request.Request(url, headers=head)
  104. html = ""
  105. try:
  106. response = urllib.request.urlopen(request)
  107. html = response.read().decode("utf-8")
  108. except urllib.error.URLError as e:
  109. if hasattr(e, "code"):
  110. print(e.code)#打印错误信息
  111. if hasattr(e, "reason"):
  112. print(e.reason)#打印错误原因
  113. return html
  114. #保存数据
  115. def saveData(datalist, savepath):
  116. book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象
  117. sheet = book.add_sheet("豆瓣电影Top250",cell_overwrite_ok=True) # 创建工作表
  118. col = ('电影详情链接',"图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")#定义元组
  119. try:
  120. for i in range(0,8):
  121. sheet.write(0,i,col[i]) #输入列名
  122. for i in range(0,250):
  123. print("第%d条" %(i+1))
  124. data = datalist[i]
  125. for j in range(0,8):
  126. sheet.write(i+1,j,data[j])
  127. book.save(savepath)
  128. except:
  129. print("爬取异常")
  130. if __name__ == '__main__':
  131. main()
  132. print("爬取完毕")
  133. #可视化
  134. data = pd.read_excel('豆瓣电影Top250.xls')
  135. df = data.sort_values('评分',ascending=False).head(25)
  136. v = df['影片中文名'].values.tolist() #tolist()将数据转换为列表形式
  137. d = df['评分'].values.tolist()
  138. #设置颜色
  139. color_series = ['#2C6BA0','#2B55A1','#2D3D8E','#44388E','#6A368B'
  140. '#7D3990','#A63F98','#C31C88','#D52178','#D5225B']
  141. print("-----"*15)
  142. bar = (
  143. Bar()
  144. .add_xaxis([i for i in df['影片中文名'].values.tolist()])
  145. .add_yaxis('评分前25名', df['评价数'].values.tolist())
  146. )
  147. bar.render("./条形图.html")
  148. print("柱形图保存成功!")
  149. # 读取文件
  150. fn = open('top250.txt','r',encoding='utf-8')
  151. string_data = fn.read()
  152. fn.close()
  153. # 文本预处理
  154. pattern = re.compile(u'\t||\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式
  155. string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
  156. # 文本分词
  157. seg_list_exact = jieba.cut(string_data, cut_all = False) # 精确模式分词
  158. object_list = []
  159. remove_words = [u'19', u',',u'20', u'德国', u'导演', u'日本', u'法国',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',
  160. u'20',u'大陆',u'我们',u'美国'] # 自定义去除词库
  161. for word in seg_list_exact: # 循环读出每个分词
  162. if word not in remove_words: # 如果不在去除词库中
  163. object_list.append(word) # 分词追加到列表
  164. # 词频统计
  165. word_counts = collections.Counter(object_list)
  166. word_counts_top10 = word_counts.most_common(10)
  167. print (word_counts_top10) # 输出检查
  168. word_counts_top10 = str(word_counts_top10)
  169. # 词频展示
  170. mask = np.array(Image.open('image.jpg'))
  171. wc = wordcloud.WordCloud(
  172. font_path='simfang.ttf',
  173. mask=mask,
  174. max_words=100, # 最多显示词数
  175. max_font_size=150, # 字体最大值
  176. background_color='white',
  177. width=800, height=600,
  178. )
  179. wc.generate_from_frequencies(word_counts)
  180. plt.imshow(wc)
  181. plt.axis('off')
  182. plt.show()
  183. wc.to_file('wordcloud.png')

如果错误请大佬指正。 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发