今天我带大家来使用一下这个模板
开发环境:
windows10
python3.6
开发工具:
pycharm
库:
matplotlib、numpy、lxml
代码展示:

爬虫代码还是很简单的
1.start_url = ‘http://fund.eastmoney.com/fund.html’
2.使用ua大列表,进行ua的替换
3.获取页面源码,然后解析
4.进行xpath语法提取相应的数据

def __init__(self): # 起始的请求地址----初始化 self.start_url = 'http://fund.eastmoney.com/fund.html' def parse_start_url(self): """ 发送请求,获取响应 :return: """ # 请求头 headers = { # 通过随机模块提供的随机拿取数据方法 'User-Agent': random.choice(USER_AGENT_LIST) } # 发送请求,获取响应字节数据 response = session.get(self.start_url, headers=headers).content """序列化对象,将字节内容数据,经过转换,变成可进行xpath操作的对象""" response = etree.HTML(response) """调用提取第二份响应数据""" self.parse_response_data(response) def parse_response_data(self, response): """ 解析response响应数据,提取 :return: """ # 股票名称 name_list_1 = response.xpath('//tbody/tr/td[5]/nobr/a[1]/text()') # 昨日单位净值 num_1_list_data_1 = response.xpath('//tbody/tr/td[6]/text()') # 昨日累计净值 num_2_list_data_1 = response.xpath('//tbody/tr/td[7]/text()')123456789101112131415161718192021222324252627282930313233343536将数据保存到表格,先将数据遍历
# 遍历解析3个列表数据 for a, b, c in zip(name_list, num_1_list, num_2_list): # 构造保存的excel字典数据 dict_data = { # 会根据该字典的key值创建工作簿的sheet名 '股票数据': [a, b, c] } """调用解析保存excel表格方法""" self.parse_save_excel(dict_data)123456789生成四种简单可视化
先将数据打包一下
def parse_img_four_func(self, index_list, name_list, num_1_list, num_2_list): """ 解析生成四张分析图 :param index_list: 随机数据的下标 :param name_list: 股票名称列表 :param num_1_list: 昨日单位净值列表 :param num_2_list: 昨日累计净值列表 :return: """ title_list = [] # 名称 qy_num_1 = [] # 单位净值 qy_num_2 = [] # 累计净值 for index_num in index_list: # 企业名称列表 title_list.append(name_list[index_num]) # 昨日单位净值列表 qy_num_1.append(num_1_list[index_num]) # 昨日累计净值列表 qy_num_2.append(num_2_list[index_num])12345678910111213141516171819生成折线图
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签 plt.plot(title_list, qy_num_2, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='累计净值') plt.plot(title_list, qy_num_1, 'ro-', color='#69e141', alpha=0.8, linewidth=1, label='单位净值') # 显示标签,如果不加这句,即使在plot中加了label='一些数字'的参数,最终还是不会显示标签 plt.legend(loc="upper right") plt.xticks(rotation=270) plt.xlabel('地点数量') plt.ylabel('工作属性数量') plt.savefig('根据净值生成折线图.png') plt.show()12345678910111213

生成饼图
addr_dict_key = title_list addr_dict_value = qy_num_1 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False plt.pie(addr_dict_value, labels=addr_dict_key, autopct='%1.1f%%') plt.title(f'单位净值对比') plt.savefig(f'单位净值对比-饼图') plt.show()12345678

生成散点图
# 这两行代码解决 plt 中文显示的问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 输入岗位地址和岗位属性数据 production = title_list tem = qy_num_2 colors = np.random.rand(len(tem)) # 颜色数组 plt.scatter(tem, production, s=200, c=colors) # 画散点图,大小为 200 plt.xlabel('数量') # 横坐标轴标题 plt.xticks(rotation=270) plt.ylabel('名称') # 纵坐标轴标题 plt.savefig(f'净值散点图.png') plt.show()1234567891011121314

生成柱状图
import matplotlib;matplotlib.use('TkAgg') plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') name_list = title_list num_list = [float(i) for i in qy_num_1] # 单位净值 width = 0.5 # 柱子的宽度 index = np.arange(len(name_list)) plt.bar(index, num_list, width, color='steelblue', tick_label=name_list, label='单位净值') plt.bar(index + width, qy_num_2, width, color='red', hatch='\\', label='累计净值') plt.legend(['单位净值', '累计净值'], prop=zhfont1, labelspacing=1) for a, b in zip(index, num_list): # 柱子上的数字显示 plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=7) plt.xticks(rotation=270) plt.title('净值柱状图') plt.ylabel('率') plt.legend() plt.savefig(f'净值-柱状图', bbox_inches='tight') plt.show()12345678910111213141516171819

源码展示:
# !/usr/bin/nev python# -*-coding:utf8-*-"""ua大列表"""USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1', 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36', 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)', 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1', 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36', 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)', 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4093.3 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko; compatible; Swurl) Chrome/77.0.3865.120 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:75.0) Gecko/20100101 Firefox/75.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/91.0.146 Chrome/85.0.4183.146 Safari/537.36', 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 VivoBrowser/8.4.72.0 Chrome/62.0.3202.84', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0', 'Mozilla/5.0 (X11; CrOS x86_64 13505.63.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:68.0) Gecko/20100101 Firefox/68.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36', ]from requests_html import HTMLSessionimport os, xlwt, xlrd, randomfrom xlutils.copy import copyimport numpy as npfrom matplotlib import pyplot as pltfrom matplotlib.font_manager import FontProperties # 字体库from lxml import etreesession = HTMLSession()class DFSpider(object): def __init__(self): # 起始的请求地址----初始化 self.start_url = 'http://fund.eastmoney.com/fund.html' def parse_start_url(self): """ 发送请求,获取响应 :return: """ # 请求头 headers = { # 通过随机模块提供的随机拿取数据方法 'User-Agent': random.choice(USER_AGENT_LIST) } # 发送请求,获取响应字节数据 response = session.get(self.start_url, headers=headers).content """序列化对象,将字节内容数据,经过转换,变成可进行xpath操作的对象""" response = etree.HTML(response) """调用提取第二份响应数据""" self.parse_response_data(response) def parse_response_data(self, response): """ 解析response响应数据,提取 :return: """ # 股票名称 name_list_1 = response.xpath('//tbody/tr/td[5]/nobr/a[1]/text()') # 昨日单位净值 num_1_list_data_1 = response.xpath('//tbody/tr/td[6]/text()') # 昨日累计净值 num_2_list_data_1 = response.xpath('//tbody/tr/td[7]/text()') """调用解析三个列表的方法""" self.for_parse_three_list(name_list_1, num_1_list_data_1, num_2_list_data_1) def for_parse_three_list(self, name_list, num_1_list, num_2_list): """ 解析循环, :param name_list: 股票名称 :param num_1_list: 昨日单位净值 :param num_2_list: 昨日累计净值 :return: """ # 遍历解析3个列表数据 for a, b, c in zip(name_list, num_1_list, num_2_list): # 构造保存的excel字典数据 dict_data = { # 会根据该字典的key值创建工作簿的sheet名 '股票数据': [a, b, c] } """调用解析保存excel表格方法""" self.parse_save_excel(dict_data) print(f'企业:{a}----采集完成!') """数据采集完成,调用分析生成图像方法""" self.parse_random_data(name_list, num_1_list, num_2_list) def parse_random_data(self, name_list, num_1_list, num_2_list): """ 随机抽取15条数据,进行分析 :return: """ # 存放随机号码的列表 index_list = [] for i in range(15): # 随机抽取15个数据进行分析 random_num = random.randint(0, 200) # 将随机抽取的号码添加进入准备的列表中 index_list.append(random_num) """随机号码生成以后,调用解析生成四张分析图的方法""" self.parse_img_four_func(index_list, name_list, num_1_list, num_2_list) def parse_img_four_func(self, index_list, name_list, num_1_list, num_2_list): """ 解析生成四张分析图 :param index_list: 随机数据的下标 :param name_list: 股票名称列表 :param num_1_list: 昨日单位净值列表 :param num_2_list: 昨日累计净值列表 :return: """ title_list = [] # 名称 qy_num_1 = [] # 单位净值 qy_num_2 = [] # 累计净值 for index_num in index_list: # 企业名称列表 title_list.append(name_list[index_num]) # 昨日单位净值列表 qy_num_1.append(num_1_list[index_num]) # 昨日累计净值列表 qy_num_2.append(num_2_list[index_num]) # 第一张图:根据净值生成折线图 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签 plt.plot(title_list, qy_num_2, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='累计净值') plt.plot(title_list, qy_num_1, 'ro-', color='#69e141', alpha=0.8, linewidth=1, label='单位净值') # 显示标签,如果不加这句,即使在plot中加了label='一些数字'的参数,最终还是不会显示标签 plt.legend(loc="upper right") plt.xticks(rotation=270) plt.xlabel('地点数量') plt.ylabel('工作属性数量') plt.savefig('根据净值生成折线图.png') plt.show() # 第二张图:根据单位净值生成饼图 addr_dict_key = title_list addr_dict_value = qy_num_1 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False plt.pie(addr_dict_value, labels=addr_dict_key, autopct='%1.1f%%') plt.title(f'单位净值对比') plt.savefig(f'单位净值对比-饼图') plt.show() # 第三张图:根据累计净值生成散点图 # 这两行代码解决 plt 中文显示的问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 输入岗位地址和岗位属性数据 production = title_list tem = qy_num_2 colors = np.random.rand(len(tem)) # 颜色数组 plt.scatter(tem, production, s=200, c=colors) # 画散点图,大小为 200 plt.xlabel('数量') # 横坐标轴标题 plt.xticks(rotation=270) plt.ylabel('名称') # 纵坐标轴标题 plt.savefig(f'净值散点图.png') plt.show() # 第四张图:根据净值生成柱状图 import matplotlib;matplotlib.use('TkAgg') plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') name_list = title_list num_list = [float(i) for i in qy_num_1] # 单位净值 width = 0.5 # 柱子的宽度 index = np.arange(len(name_list)) plt.bar(index, num_list, width, color='steelblue', tick_label=name_list, label='单位净值') plt.bar(index + width, qy_num_2, width, color='red', hatch='\\', label='累计净值') plt.legend(['单位净值', '累计净值'], prop=zhfont1, labelspacing=1) for a, b in zip(index, num_list): # 柱子上的数字显示 plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=7) plt.xticks(rotation=270) plt.title('净值柱状图') plt.ylabel('率') plt.legend() plt.savefig(f'净值-柱状图', bbox_inches='tight') plt.show() def parse_save_excel(self, data_dict): """ 保存数据 :return: """ # 判断保存数据的文件夹是否存在,不存在,就创建 os_path_1 = os.getcwd() + '/数据/' if not os.path.exists(os_path_1): os.mkdir(os_path_1) os_path = os_path_1 + '股票数据.xls' if not os.path.exists(os_path): # 创建新的workbook(其实就是创建新的excel) workbook = xlwt.Workbook(encoding='utf-8') # 创建新的sheet表 worksheet1 = workbook.add_sheet("股票数据", cell_overwrite_ok=True) excel_data_1 = ('股票名称', '昨日单位净值', '昨日累计净值') for i in range(0, len(excel_data_1)): worksheet1.col(i).width = 2560 * 3 # 行,列, 内容, 样式 worksheet1.write(0, i, excel_data_1) workbook.save(os_path) # 判断工作表是否存在 if os.path.exists(os_path): # 打开工作薄 workbook = xlrd.open_workbook(os_path) # 获取工作薄中所有表的个数 sheets = workbook.sheet_names() for i in range(len(sheets)): for name in data_dict.keys(): worksheet = workbook.sheet_by_name(sheets) # 获取工作薄中所有表中的表名与数据名对比 if worksheet.name == name: # 获取表中已存在的行数 rows_old = worksheet.nrows # 将xlrd对象拷贝转化为xlwt对象 new_workbook = copy(workbook) # 获取转化后的工作薄中的第i张表 new_worksheet = new_workbook.get_sheet(i) for num in range(0, len(data_dict[name])): new_worksheet.write(rows_old, num, data_dict[name][num]) new_workbook.save(os_path) def run(self): """ 启动方法 :return: """ self.parse_start_url()if __name__ == '__main__': d = DFSpider() d.run()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
|