twstock
twstock copied to clipboard
Got banned after 4 requests (3 sec gap)
每次測試都在4次請求後被禁, 請求與請求之間有三秒間隔, 以下為代碼
`import twstock import time
// Create a Stock array stock = []
// stock[i] is stock which sid = i for i in range(0, 10000): sid = str(i) # check if stock i exist if sid in twstock.twse or sid in twstock.tpex: stock.append(twstock.Stock(sid)) # print(stock[i].data) print('sid' + stock[i].sid + 'get!') time.sleep(3) # if not, its NaN else: stock.append('NaN') print('stock' + sid + 'does not exist')`
以下為輸出結果:
stock0does not exist
stock1does not exist
stock2does not exist
stock3does not exist
.
.
.
stock1097does not exist
stock1098does not exist
stock1099does not exist
stock1100does not exist
sid1101get!
sid1102get!
sid1103get!
sid1104get!
stock1105does not exist
stock1106does not exist
stock1107does not exist
Traceback (most recent call last):
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\connectionpool.py", line 426, in _make_request
six.raise_from(e, None)
File "
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\requests\adapters.py", line 439, in send
resp = conn.urlopen(
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\connectionpool.py", line 724, in urlopen
retries = retries.increment(
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\util\retry.py", line 403, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\packages\six.py", line 734, in reraise
raise value.with_traceback(tb)
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "C:\Users\USER\PycharmProjects\StockTrade\venv\lib\site-packages\urllib3\connectionpool.py", line 426, in _make_request
six.raise_from(e, None)
File "
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/USER/PycharmProjects/StockTrade/app.py", line 11, in
Process finished with exit code 1
有試過用更長時間 (10 sec) 為間隔 依然被禁
我發現可以隨機給予3-10秒sleep (抓取中華電信20年成功):
in stock.py (line 55)
def fetch(self, year: int, month: int, sid: str, retry: int=5):
params = {'date': '%d%02d01' % (year, month), 'stockNo': sid}
for retry_i in range(retry):
randNum = random.randrange(3,10) ##增加這兩行##
time.sleep(randNum) ##增加這兩行##
r = requests.get(self.REPORT_URL, params=params,
proxies=get_proxies())
請問這裡的self是要填什麼啊?謝謝> 我發現可以隨機給予3-10秒sleep (抓取中華電信20年成功):
in stock.py (line 55)
def fetch(self, year: int, month: int, sid: str, retry: int=5): params = {'date': '%d%02d01' % (year, month), 'stockNo': sid} for retry_i in range(retry): randNum = random.randrange(3,10) ##增加這兩行## time.sleep(randNum) ##增加這兩行## r = requests.get(self.REPORT_URL, params=params, proxies=get_proxies())
self 只是 python 語言裡面 class 的 instance 這裡為了要避掉 class TWSEFetcher(BaseFetcher)中 fetch fucntion 抓太快被台股 server 鎖IP的問題 在twstock/stock.py#L57 的下一行 for 迴圈裏面 增加 以下兩行 code 即可
randNum = random.randrange(3,10)
time.sleep(randNum)
呼叫方法可以參考我的Jupyter Notebook
stock_from = stock.fetch_from(2000,10) # 獲取 2010 年 01 月至今日之股票資料