一、选题背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?(10 分)
通过网络爬虫爬取股民信息,并且对爬取的数据进行进一步清洗处理,提取可利用数据信息。
二、主题式网络爬虫设计方案(10 分)
1.网络爬虫名称:“东方财富股民数据分析”。
2.网络爬虫爬取的内容与数据特征分析:
通过网络爬虫技术分析该网站网页结构获取东方财富股吧发帖数据, 获取多维度数据,并且经过数据清洗分析,获取所需数据,经过清洗后的数据无重复值无空值,使数据更加可靠。
3.网络爬虫设计方案概述:
需多个步骤实现:
通过获取网页资源,设置请求头,防止被网页识别爬虫,利用requests请求,使用etree解析网页,定位爬取资源将数据保存到csv文件中。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
三、主题页面的结构特征分析(10 分)
1.主题页面的结构与特征分析
数据来源:http://guba.eastmoney.com/list,002460_1.html
2.Htmls 页面解析
所需页面代码:
四、网络爬虫程序设计(60 分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后
面提供输出结果的截图。
1.数据爬取与采集
1 headers = { 2 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66' 3 } 4 for u in range(1,10): 5 6 url = f'http://guba.eastmoney.com/list,002460_{u}.html' 7 8 9 res = requests.get(url=url,headers=headers,allow_redirects=False).text 10 11 tree = etree.HTML(res) 12 13 href = tree.xpath('//*[@class="articleh normal_post"]/span[3]/a/@href') 14 for i,j in enumerate(href): 15 16 new_url = 'http://guba.eastmoney.com'+j 17 rea = requests.get(url=new_url,headers=headers) 18 rea.encoding = 'utf-8' 19 rea = rea.text 20 21 try: 22 ex_content = re.findall('var post_article = (.*?);',rea,re.S) 23 content = json.loads(ex_content[0]) 24 text +=content['post']['post_content'] 25 26 print(content['post']['post_content']) 27 except: 28 pass
2.对数据进行清洗和处理
1 data_dict ={} 2 3 for i in data_list: 4 shu = text.count(i) 5 data_dict[i] = shu 6 7 # 切割爬取下来的评论 8 words = jieba.lcut(text,cut_all=True) 9 10 11 # 声明一个字典,为词云做准备 12 counts = {} 13 14 # 排除长度为1的单词或标点 15 for word in words: 16 pattern = '[\u4e00-\u9fff]+' # 汉字正则表达式 17 re_compile = re.compile(pattern) 18 19 res_text = re_compile.findall(word) 20 21 if len(res_text) == 0: 22 pass 23 elif len(word) == 1: 24 pass 25 else: 26 # 整合到之前申明的字典中,并且附带出现的次数,为了词云做准备 27 counts[word] = counts.get(word,0)+1 28 29 print(counts) 30 lists = [] 31 # 转为list格式,词云接受list类型 32 item = list(counts.items()) 33 34 # 声明个匿名函数给list从出现的次数从高到低进行排序 35 item.sort(key= lambda x:x[1],reverse=True) 36 37 # 循环为了排除不需要的值 38 for j,i in enumerate(item): 39 # 只要前三的值 40 if j<3: 41 # 加入到一个新的列表 42 lists.append(i) 43 44 print(item)
3.文本分析(可选):jieba 分词、wordcloud 的分词可视化
1 plt.rcParams['font.sans-serif'] = ['SimHei'] 2 plt.rcParams['axes.unicode_minus'] = False 3 plt.bar(data_dict.keys(), data_dict.values(), 0.4, color="green") 4 plt.xticks(rotation=30) # 倾斜70度 5 plt.xlabel('关键词') 6 plt.ylabel('出现次数') 7 plt.title('对一些关键词统计直方图') 8 9 plt.show()
4.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
1 # 给词云初始化,并且设定宽高 2 mywordcloud = WordCloud(InitOpts(width='800px',height='500px') ) 3 4 # 给词云加入数据和设定单词大小和词云的图形 5 mywordcloud.add('',item,word_size_range=[30,70], shape='circle') 6 7 # 保存到文件夹 8 mywordcloud.render('D://wordcloud.html') 9 print() 10 print() 11 print(data_dict) 12 13 plt.rcParams['font.sans-serif'] = ['SimHei'] 14 plt.rcParams['axes.unicode_minus'] = False 15 plt.bar(data_dict.keys(), data_dict.values(), 0.4, color="green") 16 plt.xticks(rotation=30) # 倾斜70度 17 plt.xlabel('关键词') 18 plt.ylabel('出现次数') 19 plt.title('对一些关键词统计直方图') 20 21 plt.show()
5.将以上各部分的代码汇总,附上完整程序代码
1 import jieba 2 import requests 3 from lxml import etree 4 import re 5 import json 6 7 from matplotlib import pyplot as plt 8 from pyecharts.charts import WordCloud 9 from pyecharts.options import InitOpts 10 11 text = '' 12 data_list = ['还会涨','大涨','大跌','看多','看空','守住','拿着','不错','很好','挺好的','止损','止盈','被套了'] 13 14 headers = { 15 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66' 16 } 17 for u in range(1,10): 18 19 url = f'http://guba.eastmoney.com/list,002460_{u}.html' 20 21 22 res = requests.get(url=url,headers=headers,allow_redirects=False).text 23 24 tree = etree.HTML(res) 25 26 href = tree.xpath('//*[@class="articleh normal_post"]/span[3]/a/@href') 27 for i,j in enumerate(href): 28 29 new_url = 'http://guba.eastmoney.com'+j 30 rea = requests.get(url=new_url,headers=headers) 31 rea.encoding = 'utf-8' 32 rea = rea.text 33 34 try: 35 ex_content = re.findall('var post_article = (.*?);',rea,re.S) 36 content = json.loads(ex_content[0]) 37 text +=content['post']['post_content'] 38 39 print(content['post']['post_content']) 40 except: 41 pass 42 print(text) 43 data_dict ={} 44 45 for i in data_list: 46 shu = text.count(i) 47 data_dict[i] = shu 48 49 # 切割爬取下来的评论 50 words = jieba.lcut(text,cut_all=True) 51 52 53 # 声明一个字典,为词云做准备 54 counts = {} 55 56 # 排除长度为1的单词或标点 57 for word in words: 58 pattern = '[\u4e00-\u9fff]+' # 汉字正则表达式 59 re_compile = re.compile(pattern) 60 61 res_text = re_compile.findall(word) 62 63 if len(res_text) == 0: 64 pass 65 elif len(word) == 1: 66 pass 67 else: 68 # 整合到之前申明的字典中,并且附带出现的次数,为了词云做准备 69 counts[word] = counts.get(word,0)+1 70 71 print(counts) 72 lists = [] 73 # 转为list格式,词云接受list类型 74 item = list(counts.items()) 75 76 # 声明个匿名函数给list从出现的次数从高到低进行排序 77 item.sort(key= lambda x:x[1],reverse=True) 78 79 # 循环为了排除不需要的值 80 for j,i in enumerate(item): 81 # 只要前三的值 82 if j<3: 83 # 加入到一个新的列表 84 lists.append(i) 85 86 print(item) 87 # 给词云初始化,并且设定宽高 88 mywordcloud = WordCloud(InitOpts(width='800px',height='500px') ) 89 90 # 给词云加入数据和设定单词大小和词云的图形 91 mywordcloud.add('',item,word_size_range=[30,70], shape='circle') 92 93 # 保存到文件夹 94 mywordcloud.render('D://wordcloud.html') 95 print() 96 print() 97 print(data_dict) 98 99 plt.rcParams['font.sans-serif'] = ['SimHei'] 100 plt.rcParams['axes.unicode_minus'] = False 101 plt.bar(data_dict.keys(), data_dict.values(), 0.4, color="green") 102 plt.xticks(rotation=30) # 倾斜70度 103 plt.xlabel('关键词') 104 plt.ylabel('出现次数') 105 plt.title('对一些关键词统计直方图') 106 107 plt.show()
五、总结(10 分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
(1)可以通过数据可视化的词云和直方图的频率可以看出股民对股市的一些看法。
(2)经过数据清洗分析后,我们可以快速直观的了解到所需数据。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
通过此次课程设计,使我更加扎实的掌握了网络爬虫方面的知识,认识到了自己的不足。在学习过程中会遇到很多不认识的库也缺少对对库中方法的应用这令我非常头疼,但是通过各种途径,认识到了加载库和安装各种环境的方法。这一次的作业使我对python的认识不再只停留在字面上,提升了个人的知识。