1. 下载与安装
1.1 下载地址
1.2 环境变量设置
- 可在安装中勾选Add Python to path直接加入环境变量;
- 也可以WIN+R cmd,输入path=%path%;E:\ProgramFiles\python 回车即设置环境变量。输入Python查看设置,如下:
- 直接计算机属性中配置环境变量
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倾斜度
以上