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

以上

發佈了60 篇原創文章 · 獲贊 17 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章