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傾斜度
以上