1. 程式人生 > >Python 實現終端實時獲取股票價格

Python 實現終端實時獲取股票價格

__author__ = 'felix'
# 原作者為 felix

import requests
# requests 用於爬取新浪股票 API
import time
import sys
# sys 用於在直譯器中互動
import threading
# threading 用於多執行緒處理    

from Queue import Queue
# Queue 是有關佇列的庫
from optparse import OptionParser
# OptionParser 用於在命令列中新增選項

class Worker(threading.Thread):
# 建立類 Work,多執行緒獲取

    def __init__(self, work_queue, result_queue):
    # 寫入必須繫結的強制屬性 self, work_queue, result_queue
    # __init__ 方法的第一個引數一定是 self,用於表示建立的例項本身
    # 其中,例項是根據類來建立的
    # 在 __init__ 方法內部,可將各種屬性繫結到 self,因為 self 指向建立的例項本身

        threading.Thread.__init__(self)
        self.work_queue = work_queue
        self.result_queue = result_queue
        self.start()

    def run(self):
    # 增加一個新方法 run

        while True:
            func, arg, code_index = self.work_queue.get()
            # 獲取 func, arg, code_index
            res = func(arg, code_index)
            self.result_queue.put(res)
            if self.result_queue.full():
                res = sorted([self.result_queue.get() for i in range(self.result_queue.qsize())], key=lambda s: s[0], reverse=True)
                # sorted() 是用於排序的方法,返回副本,原始輸入不變
                # Queue.get() 用於獲取佇列
                # Queue.qsize() 返回佇列大小         
                # key=lambda s: s[0]:關鍵詞為 lambda s: s[0]
                # lambda s: s[0]:匿名函式,返回第一個元素
                # reverse=True:降序排列      
                res.insert(0, ('0', u'名稱     股價'))
                # list.insert() 用於將指定物件插入列表的指定位置        
                print '***** start *****'
                for obj in res:
                    print obj[1]
                print '***** end *****\n'
            self.work_queue.task_done()
            # 在完成一項工作後,Queue.task_done() 會向任務已經完成的佇列傳送一個訊號       


class Stock(object):
# 股票實時價格獲取

    def __init__(self, code, thread_num):
        self.code = code
        self.work_queue = Queue()
        self.threads = []
        self.__init_thread_poll(thread_num)

    def __init_thread_poll(self, thread_num):
        self.params = self.code.split(',')
        # parmas 會向函式傳入一個字典
        self.params.extend(['s_sh000001', 's_sz399001'])  
        # 預設獲取滬指、深指
        # extend(): 擴充套件,與 append() 的區別為,extend() 加入的元素是分別單個加入的
        self.result_queue = Queue(maxsize=len(self.params[::-1]))
        for i in range(thread_num):
            self.threads.append(Worker(self.work_queue, self.result_queue))

    def __add_work(self, stock_code, code_index):
        self.work_queue.put((self.value_get, stock_code, code_index))
        # self.value_get 涉及到下面的裝飾器        

    def del_params(self):
        for obj in self.params:
            self.__add_work(obj, self.params.index(obj))

    def wait_all_complete(self):
        for thread in self.threads:
            if thread.isAlive():
            # 判斷執行緒是否是啟用的
            # 從呼叫 start() 方法啟動執行緒,到 run() 方法執行完畢或者遇到未處理異常而中斷,這段時間內執行緒是啟用的           
                thread.join()
                # join() 的作用是阻塞程序直到執行緒執行完畢
                # 依次檢查執行緒池中的執行緒是否接觸,沒有結束就阻塞執行緒直到執行緒結束
                # 如果結束則跳轉執行下一個執行緒的 join() 函式                 

    @classmethod
    # 裝飾器,返回函式的高階函式    
    def value_get(cls, code, code_index):
        slice_num, value_num = 21, 3
        name, now = u'——無——', u'  ——無——'
        if code in ['s_sh000001', 's_sz399001']:
            slice_num = 23
            value_num = 1
        r = requests.get("http://hq.sinajs.cn/list=%s" % (code,))
        # 爬取新浪股票 API                
        res = r.text.split(',')
        if len(res) > 1:
            name, now = r.text.split(',')[0][slice_num:], r.text.split(',')[value_num]
        return code_index, name + ' ' + now


if __name__ == '__main__':
# 該指令碼用於直接執行,而不能被 import
    parser = OptionParser(description="Query the stock's value.", usage="%prog [-c] [-s] [-t]", version="%prog 1.0")
    # 生成命令列說明
    # %prog 將會以當前程式名的字串來代替    
    parser.add_option('-c', '--stock-code', dest='codes',
                      help="the stock's code that you want to query.")
    # 使用 add_option() 來定義命令列引數,即加入選項
    # dest 是儲存的變數                     
    parser.add_option('-s', '--sleep-time', dest='sleep_time', default=6, type="int",
                      help='How long does it take to check one more time.')
    parser.add_option('-t', '--thread-num', dest='thread_num', default=3, type='int',
                      help="thread num.")
    options, args = parser.parse_args(args=sys.argv[1:])
    # 設定好命令列後,用 parse_args() 來解析命令列
    assert options.codes, "Please enter the stock code!"  
    # 是否輸入股票程式碼
    if filter(lambda s: s[:-6] not in ('sh', 'sz', 's_sh', 's_sz'), options.codes.split(',')):  
    # 股票程式碼輸入是否正確
        raise ValueError

    stock = Stock(options.codes, options.thread_num)

    while True:
        stock.del_params()
        time.sleep(options.sleep_time)
        # sleep() 用於使程式休眠

相關推薦

Python 實現終端實時獲取股票價格

__author__ = 'felix' # 原作者為 felix import requests # requests 用於爬取新浪股票 API import time import sys # sys 用於在直譯器中互動 import threading # threading 用於多執行緒處理

Python用tushare庫獲取股票資料批量存入mysql成功

之前用了很多方法無法批量存入mysql中,現在這個方法可以了 首先你需要安裝tushare,現在最新版本是1.2.15 2018/10/15 如果之前沒有安裝,請用“開始-所有程式-附件-命令提示符”下輸入pip install tushare 如果之前安裝過,請升級pip in

python 呼叫pyautogui 實時獲取滑鼠的位置、移動滑鼠

PyAutoGUI是一個純Python的GUI自動化工具,其目的是可以用程式自動控制滑鼠和鍵盤操作,利用它可以實現自動化任務 本章介紹了許多不同函式,下面是快速的彙總參考: moveTo(x,y)將滑鼠移動到指定的 x、y 座標。 moveRel (xOffset,yOffset)相對於當前位置移動

python用線性迴歸預測股票價格

線性迴歸在整個財務中廣泛應用於眾多應用程式中。在之前的教程中,我們使用普通最小二乘法(OLS)計算了公司的beta與相對索引的比較。現在,我們將使用線性迴歸來估計股票價格。 線性迴歸是一種用於模擬因變數(y)和自變數(x)之間關係的方法。通過簡單的線性迴歸,只有一個自變數x

實時獲取股票資料API

股票資料的獲取目前有如下兩種方法可以獲取: 1.http/javascript介面取資料 2.web-service介面 1.http/javascript介面取資料 1.1Sina股票資料介面 以大秦鐵路(股票程式碼:601006)為例,如果要獲取它的最新行情,只需訪問新浪的股票資料 介面:http://

實時獲取股票資料的android app應用程式原始碼分享

最近學習Android應用開發,不知道寫一個什麼樣的程式來練練手,正好最近股票很火,就一個App來實時獲取股票資料,取名為Mystock。使用開發工具Android Studio,需要從Android官網下載,下載地址:http://developer.android.com/sdk/index.ht

python實現人臉實時監控識別程式 face_recognition

最近在發現一個很好的人臉識別的API 介面 face_recognition可以很方便的用python實現一個實時監控人臉的程式。 先介紹一下這個API介面。這是一個可以通過python或者命令列即可實現人臉識別的功能的人臉識別的庫。 安裝配置,在我電腦

金融量化分析-python量化分析系列之---使用python獲取股票歷史資料和實時分筆資料

財經資料介面包tushare的使用(一) Tushare是一款開源免費的金融資料介面包,可以用於獲取股票的歷史資料、年度季度報表資料、實時分筆資料、歷史分筆資料,本文對tushare的用法,已經存在的一些問題做一些介紹。 一:安裝tushare 為避免由於依賴包缺失導致安裝失敗,請先安裝anaconda,

呼叫sina財經api獲取實時股票價格

import tushare as ts import requests import time start = time.time() #呼叫新浪api content=requests.get('http://hq.sinajs.cn/?format=json&list=sh60

Python 實現股票資料的實時抓取

 **最近搗鼓股票的東西,想看看股票的實時漲跌資訊,又不想去看網上炒股軟體現有的資訊,所以尋思著自己寫了一個Python的股票當前價格抓取工具:** 一、得到滬深兩市的所有上市股票資料         考慮主要在東方財富網站上面抓取所有的滬深兩市的股票

python量化分析系列之---使用python獲取股票歷史資料和實時分筆資料

財經資料介面包tushare的使用(一) Tushare是一款開源免費的金融資料介面包,可以用於獲取股票的歷史資料、年度季度報表資料、實時分筆資料、歷史分筆資料,本文對tushare的用法,已經存在的一些問題做一些介紹。 一:安裝tushare 為避免由於

python實現QQ機器人(自己主動登錄,獲取群消息,發送群消息)

keep fine 繼續 fill iss data while [0 ssi 一次偶然的機會我看見了一個群裏的一個QQ號總是依據你所發的消息自己主動回復,當時非常感覺到奇妙。我知道能夠模擬登錄站點,沒想到居然也能模擬登錄QQ,首先自己想到的就是怎樣實現模擬登錄PC端的

python實現同服站點地址獲取

.cn class return 字符串 ... urlencode 一個 req exc 說明:程序使用http://s.tool.chinaz.com/same此站點查詢的結果。使用python簡單的實現抓取結果 先隨便查詢一個結果,抓包分析,如圖:

Python實現獲取Linux操作系統基礎信息

python cpu 系統信息 ip 內存 獲取信息如下: 主機名 系統版本 系統內核版本 總內存 CPU生廠商 CPU總核心數 服務器生廠商 服務器序列號 各網卡IP,MAC和網卡名信息實現代碼如下:#!/usr/bin/python

獲取股票歷史資料[日線][Python][Tushare]

import tushare as ts file = open("d:/stock_txt/stocklist_python.txt") path='d:/tushare/history/' filetype='.csv' while 1: line = file.readl

python 通過多執行緒實現Excel 批量更新商品價格

import openpyxl import threading wb = openpyxl.load_workbook('produceSales.xlsx') sheet = wb.active all_info = [] for row in sheet.rows: child

Python實現遍歷資料庫並獲取key的值

遍歷Redis資料庫中有以格式為PREFIX_*的按照key-value方式儲存的key,並列印其值.   遍歷使用SCAN,因為KEYS PREFIX_*可能會造成Redis長時間阻塞。查詢使用pipeline減少互動,提高效率。   ?

實戰 | 你知道如何用python獲取股票交易資料嗎?

專案介紹 看到標題大家的第一反應估計是怎麼用爬蟲來獲取股票交易資料,要獲取股票交易資料確實是需要用爬蟲沒錯,不過還有比使用爬蟲更加方便的方式。今天要給大家介紹的是一個專門用來獲取國內股票交易資料的開源工具Tushare。 Tushare是一個免費、開源的python財經資料介面包。主要實現對股票等金融資料

Python實現手機抓包,獲取噹噹圖書差評資料!

在這個萬物互聯的時代,手機端(App)、電腦端(Web),連線著你我他。 本次學習了手機抓包的相關知識,瞭解了Charles-mitmproxy-Appium的基本使用,通過對當當圖書評論的爬取,得以實踐。 那麼就讓我們來看看噹噹圖書「活著」的差評吧! / 01 / Charles

股票】java+js獲取股票實時資料

    呼叫sina專門的js伺服器來解析資料,這種方式我使用了有很長一段時間,速度還是相當不錯的,有時候比專門的行情軟體的實時資料還快,下面是獲取資料的部分程式碼: String url = "http://hq.sinajs.cn/list=sh6001