胡慶偉
(中海油國際貿易有限責任公司 北京市 100000)
隨著移動互聯網、物聯網等新一代信息技術產業的快速發展,使得網絡數據量產生了爆炸式的增長,每個人每天都要面對海量信息的轟炸,身處這樣一個信息爆炸的時代,如何快速、有效的獲取信息變得尤為重要,如果能夠通過簡單的編程,實現數據的自動獲取、整理、分析,將極大的提升工作效率。大數據技術的發展促使網絡爬蟲技術應用愈加廣泛,Python 編程語言因其簡單易學的特性,使得更多非計算機專業人士也能夠通過編程,開發出簡單的工具來輔助日常辦公。
在實際的辦公場景中,經常需要每天到某網站收集數據的業務,例如財務工作者需要每天到人民銀行官網查詢當天人民幣對外幣的匯率,金融分析員需要在每天收盤后采集基金、股票、期貨的交易數據,市場研究員需要每天訪問不同的網站收集市場信息等。如果有一個工具能夠每天定時的從網站采集數據并自動地發送到郵箱中,相關工作人員就只需要按時去查看,就可以節省大量工作時間,同時還可為后續利用進行數據分析和可視化奠定基礎。
Python 是由荷蘭數學和計算機科學研究學會的Guido van Rossum 于1989年底發明的一種解釋型、面向對象、動態數據類型的高級程序設計語言,是一種效率極高的語言,使用Python 編寫時,程序包含的代碼行數更少,代碼更容易閱讀、調試和擴展,被廣泛用于編寫網絡爬蟲、游戲、創建Web 應用程序等,不僅如此在科學領域也被大量運用,其提供的科學計算擴展庫:NumPy、SciPy 和matplotlib,分別為Python 提供了快速數組處理、數值運算以及繪圖功能,十分適合工程技術、科研人員處理實驗數據、制作圖表,甚至開發科學計算應用程序。本文中也將使用requests、openpyxl、pyinstaller 等第三方擴展庫,在使用之前需要通過pip install xxxx 命令進行安裝。
數據采集模塊主要使用Python 第三方庫requests 提供的網絡爬蟲框架搭建,網絡爬蟲是一種根據預先設計好的規則,從特定網站中獲取相應數據的工具,主要應用于各種數據信息收集的場景,我們常見的百度、谷歌等搜索引擎就使用了網絡爬蟲技術。網絡爬蟲的實現通常分為四個關鍵步驟:
(1)數據獲取。首先需要分析目標網站頁面,明確爬取的數據源。打開上海國際能源期貨交易中心每日交易快訊頁面URL 地 址:http://www.ine.cn/statements/daily/?name=kx, 經觀察可知交易詳細數據會根據日期組件控制動態刷新,由此判斷數據未直接存放在靜態HTML 頁面中,也就表示沒辦法使用BeautifulSoup 庫對提取的數據進行解析。然后進入開發者模式,檢查該Network 頁簽中動態頁面加載情況,動態數據一般存放在XHR 文件中,因此可以優先查找XHR 中是否存放數據。經過分析可以看到期貨交易數據實際保存的URL 地址為http://www.ine.cn/data/dailydata/kx/kx20210809.dat?temp2=1628514764422?r nd=0.028823041981317576,而該URL 中的“20210809”則控制具體顯示某天的數據。明確數據存放的URL 地址后,就可以開始編寫程序,在VS code 開發工具中新建名為download_ine.py 源文件,引用requests 庫、time 庫,獲取當天日期并拼接目標URL 地址,為了避免網站的反爬蟲設置,需要加上User-Agent 偽裝成瀏覽器訪問,最后再使用requests.get()方法完成數據抓取,主要代碼如下:
import requests,time
today=time.strftime("%Y%m%d",time.localtime())#獲取交易日期
url='http://www.ine.cn/data/dailydata/kx/kx'+today+'.dat?temp2=16 28170114791?rnd=0.2163361727157722'#將URL 中特定的日期替換成參數,確保程序每天都能找到對應的頁面
headers={
'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko) Chrome/90.0.4430.212 Safari/537.36'}
res=requests.get(url,headers=headers))#獲取頁面中的數據
(2)數據解析。通過前述分析可知交易詳細數據是動態刷新的,因此步驟(1)獲取到的數據無法通過靜態頁面解析庫BeautifulSoap 進行解析。這種能夠動態刷新的數據被存放在名為JSON 的數據結構中,可以使用requests 庫中的JSON 解碼器進行解析,僅用一行代碼json_res=res.json()即可完成。
(3)數據提取。前面提到的JSON 是一種輕量級的文本數據交換格式,其具有的層次結構與Python 中的字典、列表結構較為類似,因此通過for 循環就可以將需要的數據字段如商品種類、交割月份、前結算、持倉手、持倉變化等逐行提取出來,并使用append 方法添加到自定義的data_list 列表中,主要代碼如下:
instrument_list =json_res['o_curinstrument']#將json 格式的數據轉換為列表
data_list =[]
for instrument in instrument_list:#循環列表提取數據
PRODUCTNAME=instrument['PRODUCTNAME']#商品種類DELIVERYMONTH=instrument['DELIVERYMONTH']#交割月份
......
OPENINTEREST=instrument['OPENINTEREST']#持倉手
OPENINTERESTCHG=instrument['OPENINTERESTCHG']# 持倉變化
data_list.append([PRODUCTNAME,DELIVERYMONTH,......,OP ENINTEREST,OPENINTERE
STCHG])
(4)數據存儲。常見的數據存儲方式有兩種,存儲為CSV 格式或Excel 文件,本文介紹第三方庫openpyxl 的使用方法,將數據存儲到Excel 文件,其基本操作流程為創建工作簿對象、激活sheet頁、循環填充數據、保存文件到指定路徑,主要代碼如下:
book = Workbook() #創建Workbook 對象
sheet = book.active #激活sheet 頁
for row in data_list: #循環列表并添加到Excel
sheet.append(row)
book.save("D:/Python/workspace/export_INE.xlsx")# 保存Excel文件
郵件發送功能需要用到Python 的smtplib、email 兩個庫,其中smtplib 庫主要負責連接服務器、登錄、發送和退出,email 庫則主要處理郵件主題、收件人、發件人、正文、附件等。實現步驟大體包括連接郵件服務器、通過賬號密碼登錄郵箱、填寫收件人、填寫主題、撰寫正文、添加附件、發送郵件、退出郵箱八個部分,主要代碼如下:
sender = "xxx@qq.com"#發件人郵箱
password = "***"#發件人郵箱的密碼
to = "xxx@163.com"#收件人郵箱
msg = MIMEMultipart()#創建MIME
msg["Subject"]= "INE DATA --"+ today#添加郵件主題
msg["From"]= sender #添加發件人
msg["To"]= to #添加收件人
text = "上海國際能源交易中心期貨合約行情--""+today#添加正文內容
multipart = MIMEText(text) #創建MIMEText
msg.attach(multipart)#添加到msg
multipart= MIMEApplication(open('D:/Python/workspace/export_INE.xlsx','rb').read())#讀取附件創建MIMEApplication
multipart.add_header('Content-Disposition','attachment',filename="
export_INE.xlsx")#添加信息頭
msg.attach(multipart)
s = smtplib.SMTP("smtp.qq.com", timeout=30) #連接郵件服務器
s.login(sender, password))#登錄郵箱
s.sendmail(sender, to,msg.as_string()) )#發送郵件
s.close()#關閉郵件連接
為了使Python 程序具有更強的適用性,可以將Python 源文件生成為.exe 可執行文件,.exe 文件是一種不依賴于Python 開發運行環境,可以在Windows 操作系統中直接運行的文件類型,對非程序員的使用者更加友好。使用pyinstaller 第三方庫可以實現生成可執行文件的操作,在安裝pyinstaller 時需要與Python 放到相同目錄,安裝完成后進入download_ine.py 文件所在目錄,并運行命令pyinstaller -F download_ine.py,參數“-F”表示將Python 程序生成為單個可執行文件,從而避免因某些動態庫文件丟失導致程序無法正確運行。命令運行完畢后會在當前目錄新增加build 和dist 兩個目錄,新生成好download_ine.exe 可執行文件存放在dist 文件夾中。
在Python 程序中,定時任務功能可以通過schedule 庫來實現,但是這種方法需要將程序部署在服務器或持續運行的PC 機上,并且安裝Python 運行環境,對于普通使用者來說既不經濟,也不方便。因此,本文采取通過Windows 操作系統的“任務計劃程序”功能,實現數據采集工具程序的定時自動運行。在裝有Windows操作系統的電腦中,按順序打開“控制面板-管理工具-任務計劃程序”,新建基本任務,選擇每日22:00 點運行download_ine.exe程序,并勾選“錯過計劃開始時間立即啟動任務”選項。如此即可每日22:00 由操作系統自動運行download_ine.exe 程序,從上海國際能源交易中心網站上采集當日期貨交易數據存儲到Excel 文件中,并通過郵件發送到指定的郵箱。
本文基于Python 程序語言,詳細介紹了從指定網站中進行數據采集、數據解析、數據提取、數據存儲的過程,對發送郵件、生成可執行文件、設置定時任務等進行詳細闡述。通過實例詳細介紹了requests、openpyxl、smtplib、email、pyinstaller 等Python 自 有和第三方庫的使用方法。對于具有數據采集、郵件發送、定時任務等需求場景的讀者,本文提供了一種具有較高適用性的解決方案。