2017-04-18 2 views
3

を使用する: https://pakstockexchange.com/stock2/index_new.php?section=research&page=show_price_table_new&symbol=KELデータ抽出は、私は、このリンクから歴史的な価格を抽出することに興味を持っていますPythonの

をので、私は

import requests 
import pandas as pd 
import time as t 

t0=t.time() 

symbols =[ 
      'HMIM', 
      'CWSM','DSIL','RAVT','PIBTL','PICT','PNSC','ASL', 
      'DSL','ISL','CSAP','MUGHAL','DKL','ASTL','INIL'] 

for symbol in symbols: 
    header = { 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36", 
    "X-Requested-With": "XMLHttpRequest" 
} 
    r = requests.get('https://pakstockexchange.com/stock2/index_new.php?section=research&page=show_price_table_new&symbol={}'.format(str(symbol)), headers=header) 
    dfs = pd.read_html(r.text) 
    df=dfs[6] 
    df=df.ix[2: , ] 
    df.columns=['Date','Open','High','Low','Close','Volume'] 
    df.set_index('Date', inplace=True) 
    df.to_csv('/home/furqan/Desktop/python_data/{}.csv'.format(str(symbol)),columns=['Open','High','Low','Close','Volume'], 
      index_label=['Date']) 

    print(symbol) 


t1=t.time() 
print('exec time is ', t1-t0, 'seconds') 

リンクからコードを抽出するデータの上に次のコードを使用しています行うためにに変換しますパンダのデータフレームを保存して保存します。

問題は、多くの時間がかかり、より多くのシンボルで効率的ではないという問題です。誰でも上記の結果を効率的に達成するために他の方法を提案することはできますか?

さらに、同じ仕事をするが、より短い時間で行う他のプログラミング言語がありますか?

+1

私は時間のまともな部分がブロッキングGET要求であることを_guess_う。リクエストを非同期的に実行しようとするとどうなりますか? ['要求 - 先物](https://github.com/ross/requests-futures)で? – roganjosh

+0

私の普通のPCには、テストするためのいくつかの前提条件をダウンロードしていません:) – roganjosh

+0

私はプログラミングに慣れていないので、要求を非同期的に実行しようとする時間がかかります。ドキュメントを参照してください。 –

答えて

2

通常のGETリクエストはrequestsで「ブロック中」です。 1つの要求が送信され、1つの応答が受信されて処理されます。処理時間の少なくとも一部は応答を待つのに費やされます。代わりにすべての要求を非同期的にrequests-futuresで送信し、準備が整った時点で応答を収集することができます。

つまり、私はDSILがタイムアウトしていると思います。無作為抽出では、symbolsから無理なスピードアップを得ることができましたが、どちらの方法も約2倍です。同じ時刻にDSILがリストにある場合。

編集:私が嘘をついたように、それは複数の機会に「DSIL」との不幸な偶然の一致でした。 symbolsにあるタグの数が多いほど、非同期メソッドは標準のrequestsより速くなります。

import requests 
from requests_futures.sessions import FuturesSession 
import time 

start_sync = time.time() 

symbols =['HMIM','CWSM','RAVT','ASTL','INIL'] 

header = { 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36", 
    "X-Requested-With": "XMLHttpRequest" 
} 

for symbol in symbols: 
    r = requests.get('https://pakstockexchange.com/stock2/index_new.php?section=research&page=show_price_table_new&symbol={}'.format(str(symbol)), headers=header) 

end_sync = time.time() 

start_async = time.time() 
# Setup 
session = FuturesSession(max_workers=10) 
pooled_requests = [] 

# Gather request URLs 
for symbol in symbols: 
    request= 'https://pakstockexchange.com/stock2/index_new.php?section=research&page=show_price_table_new&symbol={}'.format(symbol) 
    pooled_requests.append(request) 

# Fire the requests 
fire_requests = [session.get(url, headers=header) for url in pooled_requests] 
responses = [item.result() for item in fire_requests] 

end_async = time.time() 

print "Synchronous requests took: {}".format(end_sync - start_sync) 
print "Async requests took:  {}".format(end_async - start_async) 

上記のコードでは、私は3倍のスピードアップで回答を得ることができます。 responsesを反復して、各応答を通常通り処理して処理することができます。

EDIT 2: 非同期リクエストの応答を通って行くと、あなたが以前行ったとして保存:

for i, r in enumerate(responses): 
    dfs = pd.read_html(r.text) 
    df=dfs[6] 
    df=df.ix[2: , ] 
    df.columns=['Date','Open','High','Low','Close','Volume'] 
    df.set_index('Date', inplace=True) 
    df.to_csv('/home/furqan/Desktop/python_data/{}.csv'.format(symbols[i]),columns=['Open','High','Low','Close','Volume'], 
      index_label=['Date']) 
+0

良い仕事。今ははるかに高速ですが、データフレームの応答を保存するために、私は非同期メソッドを使用してそれを達成することはできません。 –

+0

@FurqanHashim私はDSILタグを編集しました。あなたがそれを普通に書くのを止めるものは何もないはずです。チェックして編集してみましょう。 – roganjosh

+0

@FurqanHashim編集2を参照してください – roganjosh

関連する問題