Python-天天基金网爬虫分析

1.主题式网络爬虫名称:天天基金网爬虫分析

2.主题式网络爬虫爬取的内容与数据特征分析:通过访问天天基金的网站,爬取相对应的信息,最后保存下来做可视化分析。

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点):

首先,用request进行访问页面。

其次,用xtree来获取页面内容,用etree.xpath进行数据筛选。

最后,文件操作进行数据的保存。

难点:网站的爬取与数据筛选。
在这里插入图片描述

1.数据爬取与采集

“”“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’,
]
在这里插入图片描述

2.对数据进行清洗和处理

def \_\_init\_\_(self):# 起始的请求地址----初始化self.start\_url = 'http://fund.eastmoney.com/fund.html'# 第二份数据地址self.next\_url = 'http://fund.eastmoney.com/HBJJ\_pjsyl.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\_next\_url\_response(response)def parse\_next\_url\_response(self, response\_1):"""解析第二个数据页地址:return:"""# 请求头headers = {# 通过随机模块提供的随机拿取数据方法'User-Agent': random.choice(USER\_AGENT\_LIST)}# 发送请求,获取响应字节数据response = session.get(self.start\_url, headers=headers).content"""序列化对象,将字节内容数据,经过转换,变成可进行xpath操作的对象"""response \= etree.HTML(response)"""调用解析response响应数据方法"""self.parse\_response\_data(response, response\_1)def parse\_response\_data(self, response\_1, response):"""解析response响应数据,提取:return:"""# 股票名称name\_list\_1 = response.xpath('//tbody/tr/td\[5\]/nobr/a\[1\]/text()')name\_list\_2 \= response\_1.xpath('//tbody/tr/td\[5\]/nobr/a\[1\]/text()')# 合并name\_list = name\_list\_1 + name\_list\_2# 昨日单位净值num\_1\_list\_data\_1 = response.xpath('//tbody/tr/td\[6\]/text()')num\_1\_list\_data\_2 \= response\_1.xpath('//tr/td\[6\]/span/text()')# 合并num\_1\_list = num\_1\_list\_data\_1 + num\_1\_list\_data\_2# 昨日累计净值num\_2\_list\_data\_1 = response.xpath('//tbody/tr/td\[7\]/text()')num\_2\_list\_data\_2 \= response\_1.xpath('//tr/td\[7\]/text()')# 合并num\_2\_list = num\_2\_list\_data\_1 + num\_2\_list\_data\_2"""调用解析三个列表的方法"""self.for\_parse\_three\_list(name\_list, num\_1\_list, num\_2\_list)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)

4.数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)

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\_listaddr\_dict\_value \= qy\_num\_1plt.rcParams\['font.sans-serif'\] = \['Microsoft YaHei'\]plt.rcParams\['axes.unicode\_minus'\] = Falseplt.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\_listtem \= qy\_num\_2colors \= np.random.rand(len(tem))  # 颜色数组plt.scatter(tem, production, s=200, c=colors)  # 画散点图,大小为 200plt.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'\] = Falsezhfont1 \= matplotlib.font\_manager.FontProperties(fname='C:\\Windows\\Fonts\\simsun.ttc')name\_list \= title\_listnum\_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()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.将以上各部分的代码汇总,附上完整程序代码

"""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 HTMLSession
import os, xlwt, xlrd, random
from xlutils.copy import copy
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font\_manager import FontProperties  # 字体库
from lxml import etree
session \= HTMLSession()class DFSpider(object):def \_\_init\_\_(self):# 起始的请求地址----初始化self.start\_url = 'http://fund.eastmoney.com/fund.html'# 第二份数据地址self.next\_url = 'http://fund.eastmoney.com/HBJJ\_pjsyl.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\_next\_url\_response(response)def parse\_next\_url\_response(self, response\_1):"""解析第二个数据页地址:return:"""# 请求头headers = {# 通过随机模块提供的随机拿取数据方法'User-Agent': random.choice(USER\_AGENT\_LIST)}# 发送请求,获取响应字节数据response = session.get(self.start\_url, headers=headers).content"""序列化对象,将字节内容数据,经过转换,变成可进行xpath操作的对象"""response \= etree.HTML(response)"""调用解析response响应数据方法"""self.parse\_response\_data(response, response\_1)def parse\_response\_data(self, response\_1, response):"""解析response响应数据,提取:return:"""# 股票名称name\_list\_1 = response.xpath('//tbody/tr/td\[5\]/nobr/a\[1\]/text()')name\_list\_2 \= response\_1.xpath('//tbody/tr/td\[5\]/nobr/a\[1\]/text()')# 合并name\_list = name\_list\_1 + name\_list\_2# 昨日单位净值num\_1\_list\_data\_1 = response.xpath('//tbody/tr/td\[6\]/text()')num\_1\_list\_data\_2 \= response\_1.xpath('//tr/td\[6\]/span/text()')# 合并num\_1\_list = num\_1\_list\_data\_1 + num\_1\_list\_data\_2# 昨日累计净值num\_2\_list\_data\_1 = response.xpath('//tbody/tr/td\[7\]/text()')num\_2\_list\_data\_2 \= response\_1.xpath('//tr/td\[7\]/text()')# 合并num\_2\_list = num\_2\_list\_data\_1 + num\_2\_list\_data\_2"""调用解析三个列表的方法"""self.for\_parse\_three\_list(name\_list, num\_1\_list, num\_2\_list)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\_listaddr\_dict\_value \= qy\_num\_1plt.rcParams\['font.sans-serif'\] = \['Microsoft YaHei'\]plt.rcParams\['axes.unicode\_minus'\] = Falseplt.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\_listtem \= qy\_num\_2colors \= np.random.rand(len(tem))  # 颜色数组plt.scatter(tem, production, s=200, c=colors)  # 画散点图,大小为 200plt.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'\] = Falsezhfont1 \= matplotlib.font\_manager.FontProperties(fname='C:\\Windows\\Fonts\\simsun.ttc')name\_list \= title\_listnum\_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\[i\])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\[i\])# 获取工作薄中所有表中的表名与数据名对比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()

仅用作项目练习,切勿商用
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述
在这里插入图片描述
二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
在这里插入图片描述
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
在这里插入图片描述
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

在这里插入图片描述
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述
今天就分享到这里吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

益百分4.0版益生君重磅来袭,为您保驾护航

益百分4.0版益生君重磅来袭,为您保驾护航 暑期来临,很多人们终于等来了一年中最幸福的时刻,三五成群、结伴旅游成为他们选择欢度暑假的方式。 全国各地的旅游景点也迎来了旺季,各大旅游公司也推出了各种各样的旅游团购活动&#x…

FFmpeg交叉编译报错pkg-config not found

ffmpeg交叉编译时报错: WARNING: arm-linux-gnueabihf-pkg-config not found, library detection may fail.不慌,没有就下载嘛,直接install: sudo apt-get install pkg-config-arm-linux-gnueabihf 参考: How To I…

C++面试八股文:std::deque用过吗?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使…

[学习笔记]3GPP R18宣布冻结,对物联网的影响是哪些?

6月18日,在上海举行的3GPP RAN(无线接入网络项目)第104次会议上,5G-A的第一代技术标准R18标准正式冻结。R18标准从立项到冻结历时3年多,是5G标准的第四版,也是面向5G-Advanced(5G-A)…

API-事件对象

学习目标: 掌握事件对象 学习内容: 获取事件对象事件对象常用属性trim方法案例 获取事件对象: 事件对象是什么 也是个对象,这个对象里有事件触发时的相关信息。 例如:鼠标点击事件中,事件对象就存了鼠标…

未来几年大多数人会面临的困境

未来几年,以下几个社会现象将会成为现实,希望这些相关行业的从业者早做准备,未雨绸缪。 一、就业难将会成为常态 就业将会越来越难、最近三年曾经如日中天的互联网企业在裁员降薪、曾经的用工大户也在裁员、不少倒闭破产的中小企业主也加入…

蓝牙ble数传芯片推荐,TD5327A芯片蓝牙5.1—拓达半导体

蓝牙数传芯片TD5327A芯片是一款支持蓝牙BLE的纯数传芯片,蓝牙5.1版本。芯片的亮点在于性能强,除了支持APP端直接对芯片做设置与查询操作,包括直接操作蓝牙芯片自身的IO与PWM口以外,还支持RTC日历功能,可以做各类定时类…

深度学习工具jupyter的new没有环境选项以及遇到的EnvironmentLocationNotFound:Not such a environment

jupyter安装使用 安装完Anaconda(安装Anaconda具体请参考其他教程)后,一般默认有安装jupyter打开 注意当前是base环境,后期使用jupyter需要切换环境 我们找到文件地址。用记事本打开 可以搜索:c.NotebookApp.noteb…

Redis规范

1 键值对的建议 1.1、key名建议; 建议key name设计:业务名:表名:id 比如: set school:student:1 martin 要求:不包含特殊字符 1.2、string 类型控制在10 KB以内,hash、list、set、zset元素个数不要超过5000&#…

C++的工厂模式与建造者模式连用

设计模式 工厂模式与建造者模式连用工厂模式建造者模式具体使用 工厂模式与建造者模式连用 工厂模式 工厂模式:是一种常用的设计模式,它属于创建型设计模式,旨在将对象的创建过程与使用过程分离,以实现解耦和灵活性。工厂模式通…

在Ubuntu 14.04上安装和配置SNMP守护程序和客户端的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 作为系统管理员的重要工作之一是收集关于服务器和基础设施的准确信息。有许多工具和选项可用于收集和处理这种类型的信息。其中许…

数据库期末复习知识点

A卷 1. 选择题(30) 2. 判断范式(10) 判断到第三范式 3. 程序填空(20) 4. 分析填空(15) 5. 写SQL(25) 5一题 恶性 B卷 1. 单选(30) 2. 填空 (20) 3. 程序填空(20) 4. 写SQL(30) 知识点 第一章 数据库管理系统(DBMS) 主要功能 数据定义功能 (DDL, 数据定义语言, …

linux 登录ftp报Received message too long 1416128883

在linux 登录ftp报Received message too long 1416128883 [rootlocalhost ~]# sftp oaftp172.20.xx.xx解决办法: [rootlocalhost ~]# usermod -s /bin/bash oaftp[rootlocalhost ~]# systemctl restart vsftpd.service[rootlocalhost ~]# sftp oaftp172.20.xx.xx完…

JavaWeb系列十六: jQuery初步入门

跟老韩-JavaScript开发利器之jQuery 1.1 原理示意图1.2 快速入门1.2 什么是jquery对象1.3 dom对象转jQuery对象1.4 jQuery对象转dom对象 jQuery是一个快速的, 简洁的javaScript库, 使用户能更方便地处理HTML, css, dom…提供方法, events, 选择器, 并且方便地为网站提供AJAX交互…

【ElasticSearch】ElasticSearch实战

初步检索 检索 ES 信息 1)、GET /_cat/nodes:查看所有节点 127.0.0.1 44 83 1 0.01 0.01 0.00 dilm * 1b06a843b8e3 *代表主节点 2)、GET /_cat/health:查看健康状况 1718265331 07:55:31 elasticsearch yellow 1 1 4 4 0 0…

ansible archive模块

用于创建归档文件的模块。它允许你在目标主机上创建tar、zip、gzip、bzip2、xz等类型的归档文件。解压使用unarchive模块。 path:要打包的源目录或文件的路径。(可以是单个文件或目录,也可以是包含多个文件和目录的列表。)dest&am…

告别单张OCR,Umi-OCR让你轻松实现批量识别!

大家好,今天我要给大家介绍一款强大的OCR识别软件——Umi-OCR。相信很多朋友都用过QQ、微信或天若OCR等应用来进行图片文字识别,但你是否遇到过需要批量识别图片文字时,这些软件却无法满足你的需求呢?今天,这个问题将迎…

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入&…

Spring数据访问架构设计解析

一、Spring JDBC 数据访问 1、简化了jdbc操作,定义了模板类JdbcTemplate 2、提高开发效率,构建了嵌入式数据源EmbeddedDatabase 3、统一底层异常结构DataAccessException 二、Spring事物管理器 声明式事物,Aop原理简化开发 三、Spring …

go sync包(三) 读写锁(二)

读写锁 RWMutex 写锁 加锁 RWMetex 的写锁复用了 Mutex: // Lock locks rw for writing. // If the lock is already locked for reading or writing, // Lock blocks until the lock is available. func (rw *RWMutex) Lock() {if race.Enabled {_ rw.w.state…