Python数据爬取以及可视化展示

1. 下载与安装

1.1 下载地址

Python官网地址
安装设置文档

1.2 环境变量设置
  1. 可在安装中勾选Add Python to path直接加入环境变量;
  2. 也可以WIN+R cmd,输入path=%path%;E:\ProgramFiles\python 回车即设置环境变量。输入Python查看设置,如下:环境变量设置
  3. 直接计算机属性中配置环境变量
1.3 开发工具-vscode(学习阶段)

选择vscode是写前端时候已经安装过了,现在直接集成python就可以了。
Extensions—搜索Python—点击Install安装即可。

2. 数据爬取实践

爬取天天基金网上某个基金数据,存储到本地,查询数据,可视化展示,其实可以直接查询数据解析直接可视化展示就行了,这里加了两步数据库操作主要是为了实践练习。

通过该查询地址获取解析数据源

http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=004993&sdate=&edate=
#说明 type=lsjz是查询历史净值
2.1 获取数据,BeautifulSoup解析数据
url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx'
params={'type': 'lsjz','code': code, 'sdate': sdate,'edate': edate}
res = requests.get(url, params=params, proxies=None)
#BeautifulSoup解析
soup = BeautifulSoup(res.content, 'html.parser') 
2.2 同步数据到本地
#连接MYSQL数据库
db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='fund',port=3306,charset='utf8')
print('连接数据库成功!')
#获取指针以操作数据库
conn = db.cursor() 
#清除数据
try:
   delsql = "delete from fund where `code`="+code
   conn.execute(delsql)   # 执行SQL语句
   db.commit()
except Exception as err:
   print ("Delete Error: "+str(err))
#数据同步
try:
    for rows in soup.findAll("tbody")[0].findAll("tr"):
        tbl_records=[]
        for records in rows.findAll("td"):
            tdval = records.contents
            if len(tdval)==0:
                tbl_records.append('NAN')
            else:
                tbl_records.append(tdval[0])
        #链接数据库,存储数据到本地
        val = [code, code, tbl_records[0], tbl_records[1], tbl_records[2], tbl_records[3]]
        sql = u"INSERT INTO fund(code,name,nav_date,unit_net,total_net,rise_rate) VALUES(%s,%s,%s,%s,%s,%s)"
        conn.execute(sql,val)
        db.commit()  #提交操作
except Exception as err:
	print ("Insert Error: "+str(err))
finally:
    #关闭MySQL连接
    conn.close()
    db.close()
2.3 数据查询
try:
   # 打开数据库连接
   db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='fund',port=3306,charset='utf8') 
   # 使用cursor()方法获取操作游标
   cursor = db.cursor()
   #查询数据
   sql = "SELECT * FROM fund WHERE `code`="+code
   # 执行SQL语句
   cursor.execute(sql)
   results = cursor.fetchall()
   #可视化展示数据整理
   cdate=[]
   crate=[]
   for row in results:
       #(122, '004993', '004993', datetime.date(2020, 1, 8), Decimal('1.2475'), Decimal('1.2475'), '-0.51%')
       #cdate.append(str(row[3]))
       cdate.append(pd.to_datetime(row[3]))
       crate.append(row[4])   
except Exception as err:
   print ("Select Error: " + str(err))
finally:
   #关闭MySQL连接
   conn.close()
   db.close()

2.4 可视化(图形化展示)

#解决plot不能显示中文问题
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False    
#绘制折线图
ax = plt.subplot(111)
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d')) #设置日期显示格式
plt.xticks(pd.date_range(cdate[-1],cdate[0],freq='D'),rotation=45) #x轴刻度线,rotation倾斜度
ax.plot(cdate,crate,color='r')
ax.set_title('每日净值折线图',fontsize=16)
ax.set_xlabel('日期',color='blue')
ax.set_ylabel('净值',color='red')
plt.show()    

主程序

# 主程序
if __name__ == "__main__":
    #爬取数据,并存储
    query_def_fund('004993','2019-12-01','2020-01-31')
    #查询数据,并绘图展示
    query_fund_show('004993')

综上,可以实现爬取基金净值,图形化展示,最终如下:
图形化每日净值

3. 实践过程中问题汇总

Unable to import ‘bs4’
pip3 install BeautifulSoup4

问题原因:未安装BeautifulSoup4模块
解决办法:安装BeautifulSoup4模块

TypeError: object of type ‘Response’ has no len()
res = requests.get(url, params=params, proxies=None)
soup = BeautifulSoup(res.**content**, 'html.parser')
print(soup)

问题原因:res是requests对象,无法用BeautifulSoup解析,
解决办法:需要更改为res.content

TypeError: can only concatenate str (not “AttributeError”) to str

问题原因:print ("Select Error: " + err) 时候报出,类型不兼容不能组合。
解决办法:print ("Select Error: " + str(err))

Cursor’ object has no attribute ‘commit’

删除数据时错误信息提示
问题原因:删除时候写成了conn.commit()
解决办法:修改为db.commit()

输出折线图中文乱码

解决此问题方法来源
在python脚本中增加配置支持中文的代码。

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']    # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False           # 解决保存图像是负号'-'显示为方块的问题
输出折线图X轴坐标刻度未显示

日期刻度未显示
问题原因:有两个方面都会产生这个问题
(1)日期用了字符串
(2)绘制刻度时设置日期相反(图中折线方向也体现了此问题)

解决办法:
做时间格式转换

cdate.append(pd.to_datetime(row[3]))`

日期设置

plt.xticks(pd.date_range(cdate[-1], cdate[0],freq='D'),rotation=45) #x轴刻度线,rotation倾斜度

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值