当前位置:   article > 正文

【Pyhton应用】python爬虫数据分析案例详解_爬虫python数据分析

爬虫python数据分析

目录

一、项目内容: 

第一步:获取评论数据

第二步:词频统计并可视化展示

第三步:绘制词云

二、项目实现: 

第一步:获取评论数据

 (1)导入python库

 (2)获取评论数据

 (3)保存json文件 

第二步:词频统计并可视化展示

 (4)解析json数据,获取评论字符串列表

 (5) 去除文本中特殊字符

 (6) 将数据保存在txt文件

 (7)从txt文件中获取评论字符串

 (8) 中文分词

 (9)去除停用词

(10) 绘制词频统计表

第三步:绘制词云

(11)绘制词云图

(12)完整代码


一、项目内容: 

第一步:获取评论数据

  • 评论条数不少于100条

第二步:词频统计并可视化展示

  • 数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
  • 中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
  • 统计top10高频词
  • 可视化展示高频词

第三步:绘制词云

  • 根据词频生成词云
  • 可选项-添加背景图片,根据背景图片轮廓生成词云

二、项目实现: 

第一步:获取评论数据

  • 统计评论条数至少于100条

(1)导入python库

  1. import json
  2. import re
  3. import requests
  4. from bs4 import BeautifulSoup
  5. import os
  6. import time
  7. import random
  8. import jieba
  9. import matplotlib.pyplot as plt
  10. from wordcloud import WordCloud

 (2)获取评论数据

  1. #爬取评论数据
  2. def crawlData(start,limit):#start,limit爬取的评论序号和限制
  3. """
  4. 爬取豆瓣Top250《肖申克的救赎》评论数据,返回评论字符串列表
  5. """
  6. comments=[]
  7. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
  8. url='https://movie.douban.com/subject/1292052/comments?start={}&limit={}&status=P&sort=new_score'.format(start,limit)
  9. try:
  10. response = requests.get(url,headers=headers)
  11. #print(response.status_code)
  12. #将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
  13. soup = BeautifulSoup(response.text,'lxml')
  14. #返回的是class为short的<span>所有标签
  15. shorts = soup.find_all('span',{'class':'short'})
  16. #print(shorts)
  17. for short in shorts:
  18. strs = short.get_text()
  19. comments.append(strs)
  20. print("正在爬取数据,请稍后……")
  21. except Exception as e:
  22. print(e)
  23. return comments

(3)保存json文件 

  1. #保存json文件
  2. def saveJsonFile(comments,JsonFileName):
  3. jsons = []
  4. id = 0#给评论添加索引
  5. for com in comments:
  6. js = {}
  7. js['id'] = id
  8. js['comment'] = com
  9. jsons.append(js)
  10. id += 1
  11. jsons = str(jsons).replace('\'', '\"')#json中的索引都是双引号
  12. json_data = json.loads(jsons)
  13. with open('work/' + JsonFileName + '.json', 'w', encoding='UTF-8') as f:
  14. json.dump(json_data, f, ensure_ascii=False)
  15. print("数据已保存为%s.json"%saveJsonFile())

 100条评论,json文件预览:

第二步:词频统计并可视化展示

  • 数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
  • 中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
  • 统计top10高频词
  • 可视化展示高频词

(4)解析json数据,获取评论字符串列表

  1. #解析json数据,获取评论字符串列表
  2. def getTextForJson(JsonFileName):
  3. #打开json文件获取数据
  4. with open('work/' + JsonFileName + '.json', 'r', encoding='UTF-8') as file:
  5. comments = json.loads(file.read()) # json.loads解码JSON 数据。该函数返回Python 字段的数据类型
  6. text = []#文本存放列表
  7. for com in comments:
  8. text.append(com['comment'])
  9. return text

(5) 去除文本中特殊字符

  1. # 去除文本中特殊字符
  2. def clear_special_char(text):
  3. content=[]
  4. for con in text:
  5. con = re.sub(r"\n|\t|\r|\r\n|\n\r|\x08|\\", "", con)
  6. content.append(con)
  7. return content

(6) 将数据保存在txt文件

  1. # 将数据保存在txt文件
  2. def saveTxtFile(text,TxtFileName):
  3. contents = ''
  4. for txt in text:
  5. contents+=txt
  6. with open('work/' + TxtFileName + '.txt', 'w', encoding='UTF-8') as f:
  7. f.write(contents)
  8. print("数据已保存为%s.txt"%TxtFileName)

(7)从txt文件中获取评论字符串

  1. # 从txt文件中获取评论字符串
  2. def getTextForTxt(TxtFileName):
  3. with open('work/' + TxtFileName + '.txt', 'r', encoding='UTF-8') as file:
  4. text = file.read()
  5. return text

(8) 中文分词

  1. # 中文分词
  2. def fenci(text):
  3. words = jieba.cut(text.strip())
  4. return words

 (9)去除停用词

  1. #去除停用词
  2. def movestopwords(words):
  3. #创建停用词列表
  4. stopwords = [line.strip() for line in open('data\stopwords.txt', encoding='UTF-8').readlines()]#列表生成式
  5. # 将分词后的对象进行去除停用词
  6. strs = ''
  7. # 去停用词
  8. for word in words:
  9. if word not in stopwords:
  10. if word != '\t':
  11. strs += word
  12. strs += " "
  13. return strs

(10) 绘制词频统计

  1. #绘制词频统计表
  2. def drawcounts(strs):
  3. words = jieba.lcut(strs)#精确模式分词
  4. counts = {}
  5. for word in words:
  6. if len(word) == 1: # 排除单个字符分词的影响
  7. continue
  8. else:
  9. counts[word] = counts.get(word, 0) + 1
  10. # 按词频从高到低排序
  11. counts = sorted(counts.items(), key=lambda x: x[1], reverse=True)
  12. # 输出前10个
  13. for i in range(10):
  14. word, count = counts[i]
  15. print('{:<10}{:>5}'.format(word, count))
  16. # 绘制柱状图
  17. x_word=[]
  18. y_count=[]
  19. for i in range(10):
  20. word, count = counts[i]
  21. x_word.append(word)
  22. y_count.append(count)
  23. # 设置显示中文
  24. plt.rcParams['font.sans-serif'] = ['SimHei']
  25. # 设置图片大小
  26. plt.figure(figsize=(20, 15))
  27. plt.bar(range(len(y_count)), y_count, color='r', tick_label=x_word, facecolor='#9999ff', edgecolor='white')
  28. # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
  29. plt.xticks(rotation=45, fontsize=20)
  30. plt.yticks(fontsize=20)
  31. # plt.legend()
  32. plt.title('''《肖申克的救赎》评论词频统计''', fontsize=24)
  33. plt.savefig('./work/imgs/bar_result.jpg')
  34. plt.show()
  35. return

第三步:绘制词云

  • 根据词频生成词云
  • 可选项-添加背景图片,根据背景图片轮廓生成词云

(11)绘制词云图

  1. #绘制词云图
  2. def drawcloud(strs):
  3. # 生成对象
  4. wc = WordCloud(font_path="fonts\simhei.ttf", width=500, height=400, mode="RGBA",
  5. background_color=None).generate(strs)
  6. # 显示词云图
  7. plt.imshow(wc, interpolation="bilinear")
  8. plt.axis("off")
  9. plt.show()
  10. # 保存文件
  11. wc.to_file("./work/imgs/WordCloud.png")

(12)完整代码

  1. import json
  2. import re
  3. import requests
  4. from bs4 import BeautifulSoup
  5. import os
  6. import time
  7. import random
  8. import jieba
  9. import matplotlib.pyplot as plt
  10. from wordcloud import WordCloud
  11. #爬取评论数据
  12. def crawlData(start,limit):#start,limit爬取的评论序号和限制
  13. """
  14. 爬取豆瓣Top250《肖申克的救赎》评论数据,返回评论字符串列表
  15. """
  16. comments=[]
  17. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
  18. url='https://movie.douban.com/subject/1292052/comments?start={}&limit={}&status=P&sort=new_score'.format(start,limit)
  19. try:
  20. response = requests.get(url,headers=headers)
  21. #print(response.status_code)
  22. #将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
  23. soup = BeautifulSoup(response.text,'lxml')
  24. #返回的是class为short的<span>所有标签
  25. shorts = soup.find_all('span',{'class':'short'})
  26. #print(shorts)
  27. for short in shorts:
  28. strs = short.get_text()
  29. comments.append(strs)
  30. print("正在爬取数据,请稍后……")
  31. except Exception as e:
  32. print(e)
  33. return comments
  34. #保存json文件
  35. def saveJsonFile(comments,JsonFileName):
  36. jsons = []
  37. id = 0#给评论添加索引
  38. for com in comments:
  39. js = {}
  40. js['id'] = id
  41. js['comment'] = com
  42. jsons.append(js)
  43. id += 1
  44. jsons = str(jsons).replace('\'', '\"')#json中的索引都是双引号
  45. json_data = json.loads(jsons)
  46. with open('work/' + JsonFileName + '.json', 'w', encoding='UTF-8') as f:
  47. json.dump(json_data, f, ensure_ascii=False)
  48. print("数据已保存为%s.json"%saveJsonFile())
  49. #解析json数据,获取评论字符串列表
  50. def getTextForJson(JsonFileName):
  51. #打开json文件获取数据
  52. with open('work/' + JsonFileName + '.json', 'r', encoding='UTF-8') as file:
  53. comments = json.loads(file.read()) # json.loads解码JSON 数据。该函数返回Python 字段的数据类型
  54. text = []#文本存放列表
  55. for com in comments:
  56. text.append(com['comment'])
  57. return text
  58. # 去除文本中特殊字符
  59. def clear_special_char(text):
  60. content=[]
  61. for con in text:
  62. con = re.sub(r"\n|\t|\r|\r\n|\n\r|\x08|\\", "", con)
  63. content.append(con)
  64. return content
  65. # 将数据保存在txt文件
  66. def saveTxtFile(text,TxtFileName):
  67. contents = ''
  68. for txt in text:
  69. contents+=txt
  70. with open('work/' + TxtFileName + '.txt', 'w', encoding='UTF-8') as f:
  71. f.write(contents)
  72. print("数据已保存为%s.txt"%TxtFileName)
  73. # 从txt文件中获取评论字符串
  74. def getTextForTxt(TxtFileName):
  75. with open('work/' + TxtFileName + '.txt', 'r', encoding='UTF-8') as file:
  76. text = file.read()
  77. return text
  78. # 中文分词
  79. def fenci(text):
  80. words = jieba.cut(text.strip())
  81. return words
  82. #去除停用词
  83. def movestopwords(words):
  84. #创建停用词列表
  85. stopwords = [line.strip() for line in open('data\stopwords.txt', encoding='UTF-8').readlines()]#列表生成式
  86. # 将分词后的对象进行去除停用词
  87. strs = ''
  88. # 去停用词
  89. for word in words:
  90. if word not in stopwords:
  91. if word != '\t':
  92. strs += word
  93. strs += " "
  94. return strs
  95. #绘制词频统计表
  96. def drawcounts(strs):
  97. words = jieba.lcut(strs)#精确模式分词
  98. counts = {}
  99. for word in words:
  100. if len(word) == 1: # 排除单个字符分词的影响
  101. continue
  102. else:
  103. counts[word] = counts.get(word, 0) + 1
  104. # 按词频从高到低排序
  105. counts = sorted(counts.items(), key=lambda x: x[1], reverse=True)
  106. # 输出前10个
  107. for i in range(10):
  108. word, count = counts[i]
  109. print('{:<10}{:>5}'.format(word, count))
  110. # 绘制柱状图
  111. x_word=[]
  112. y_count=[]
  113. for i in range(10):
  114. word, count = counts[i]
  115. x_word.append(word)
  116. y_count.append(count)
  117. # 设置显示中文
  118. plt.rcParams['font.sans-serif'] = ['SimHei']
  119. # 设置图片大小
  120. plt.figure(figsize=(20, 15))
  121. plt.bar(range(len(y_count)), y_count, color='r', tick_label=x_word, facecolor='#9999ff', edgecolor='white')
  122. # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
  123. plt.xticks(rotation=45, fontsize=20)
  124. plt.yticks(fontsize=20)
  125. # plt.legend()
  126. plt.title('''《肖申克的救赎》评论词频统计''', fontsize=24)
  127. plt.savefig('./work/imgs/bar_result.jpg')
  128. plt.show()
  129. return
  130. #绘制词云图
  131. def drawcloud(strs):
  132. # 生成对象
  133. wc = WordCloud(font_path="fonts\simhei.ttf", width=500, height=400, mode="RGBA",
  134. background_color=None).generate(strs)
  135. # 显示词云图
  136. plt.imshow(wc, interpolation="bilinear")
  137. plt.axis("off")
  138. plt.show()
  139. # 保存文件
  140. wc.to_file("./work/imgs/WordCloud.png")
  141. if __name__ == "__main__":
  142. JsonFileName = 'hhh'
  143. TxtFileName = 'xxx'
  144. # 判断文件是否存在
  145. if os.path.exists('work/'+JsonFileName+'.json')==False:#不存在,爬取
  146. print("文件不存在,开始爬取页面。")
  147. # 1、爬取100条评论数据
  148. limit = 10 # 每页最大爬取条数
  149. comments = []
  150. for i in range(0, 10):
  151. comments += crawlData(i * limit, limit)
  152. print("数据爬取成功!")
  153. # 2、保存json数据
  154. saveJsonFile(comments,JsonFileName)
  155. else:
  156. print(JsonFileName+".json文件已存在。")
  157. # 3、从json文件中获取评论信息
  158. text = getTextForJson(JsonFileName)
  159. #print(text)
  160. #清理特殊字符
  161. text = clear_special_char(text)
  162. #print(text)
  163. #将清洗后的字符串保存在txt文件中
  164. if os.path.exists('work/'+TxtFileName+'.txt')==False:
  165. saveTxtFile(text, TxtFileName)
  166. else:
  167. print(TxtFileName+".txt文件已存在。")
  168. text = getTextForTxt(TxtFileName)#获取txt文本(str)
  169. print(text)
  170. #中文分词
  171. words = fenci(text)
  172. #for word in words:
  173. # print(word)
  174. #去除停用词
  175. strs = movestopwords(words)
  176. print(strs)
  177. # 绘制词频统计表
  178. drawcounts(strs)
  179. # 绘制词云图
  180. drawcloud(strs)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/422590
推荐阅读
相关标签
  

闽ICP备14008679号