用 2captcha 破解驗證碼,輕鬆抓取台股券商分點買賣日報
BY PJ.
-2025 年 4 月 26 日
(最後更新於: 2025 年 5 月 10 日)
台股券商分點日報,是觀察主力買賣動向
的實用工具。不過,證交所的查詢網站會要求輸入驗證碼,對爬蟲來說很不方便。這篇文章就要教你怎麼用 2captcha
這個工具自動破解驗證碼,再結合 Python 抓下主力券商進出排行,讓你快速得到分析資料。
目錄
1. 什麼是 2captcha?
2captcha 是一個提供「真人幫你解驗證碼」的服務。你只要用 API 把驗證碼圖片上傳,幾秒鐘內就能拿到正確答案,不用自己訓練 AI 模型,遇到圖片換來換去也沒差。
- 每次辨識費用超便宜(約 0.001 美元)。
- 多種驗證碼都能破解,速度約 10 秒內。
- 適合自動化抓資料用。
2. 申請帳號與準備 API KEY
- 前往 2captcha 官網 註冊帳號。
- 儲值一點點金額(最低 3 美元就夠用很久)。
- 登入後到 dashboard > API Keys 取得你的
API Key
。
3. 安裝套件
先裝好你需要用到的 Python 套件:
pip install 2captcha-python selenium pandas beautifulsoup4
4. Selenium 取得驗證碼圖片
我們要自動打開台灣證交所買賣日報查詢,拿到驗證碼圖片並存檔:
import time, base64
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://bsr.twse.com.tw/bshtm/')
time.sleep(1)
# 切換到主查詢 frame
browser.switch_to.frame('page1')
# 取得驗證碼圖片元素
img_element = browser.find_elements(By.TAG_NAME, 'img')[1]
# 把圖片轉為 base64
img_base64 = browser.execute_script("""
var img = arguments[0];
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
return canvas.toDataURL('image/jpeg').substring(22);
""", img_element)
# 存成 code.png
with open('code.png', 'wb') as f:
f.write(base64.b64decode(img_base64))
print("已存出驗證碼圖片 code.png")
5. 用 2captcha 辨識驗證碼
把剛剛存下來的圖片傳給 2captcha,要填入你的 API KEY:
import requests
import time
api_key = '你的API_KEY' # 請填入自己的key
file = {'file': open('code.png', 'rb')}
data = {'key': api_key, 'method': 'post'}
# 上傳圖片取得ID
resp = requests.post('http://2captcha.com/in.php', files=file, data=data)
if 'OK' in resp.text:
captcha_id = resp.text.split('|')[1]
# 等待辨識
for i in range(10):
time.sleep(3)
check = requests.get(
f'http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}'
)
if 'OK' in check.text:
code = check.text.split('|')[1].upper()
print('驗證碼:', code)
break
elif 'CAPCHA_NOT_READY' in check.text:
continue
else:
print('驗證失敗:', check.text)
else:
print('上傳失敗:', resp.text)
6. 自動查詢券商分點日報
把剛剛取得的驗證碼輸入查詢,就能抓取表格資料:
from selenium.webdriver.common.by import By
import pandas as pd
from bs4 import BeautifulSoup
import datetime
StockNo = '2330' # 查詢股票 2330
browser.find_element(By.NAME, 'TextBox_Stkno').send_keys(StockNo)
browser.find_element(By.NAME, 'CaptchaControl1').send_keys(code)
browser.find_element(By.NAME, 'btnOK').click()
time.sleep(2)
# 轉換 frame 取得表格
browser.switch_to.default_content()
browser.switch_to.frame('page2')
soup = BeautifulSoup(browser.page_source, "html.parser")
tbody_list = [
t for t in soup.find('body').find_all('tbody')
if '交易日期' not in str(t)
]
# 整理成 DataFrame
rows = []
for tbody in tbody_list:
tds = tbody.find_all('td')
if len(tds) == 5:
rows.append([td.text.strip() for td in tds])
df = pd.DataFrame(rows, columns=['序', '證券商', '成交單價', '買進股數', '賣出股數'])
df = df[df['序'].str.isnumeric()]
df['成交單價'] = df['成交單價'].astype(float)
df['買進股數'] = df['買進股數'].astype(float)
df['賣出股數'] = df['賣出股數'].astype(float)
# 儲存結果
df.to_excel(f"{StockNo}_{datetime.datetime.now():%Y-%m-%d}.xlsx", index=False)
print("已儲存查詢結果。")
7. 分析主力買賣超券商排行
將券商名稱清理、比對、計算主力進出排行(前15大、後15大):
import re
# 清理券商欄位,僅保留代碼
def extract_code(s):
m = re.search(r'[A-Za-z0-9]+', str(s))
return m.group(0) if m else ''
df['券商代號'] = df['證券商'].apply(extract_code)
# 載入券商名冊
broker_url = 'https://www.twse.com.tw/rwd/zh/brokerService/outPutExcel'
broker_df = pd.read_excel(broker_url)
broker_df = broker_df[['證券商代號', '證券商名稱']].rename(
columns={'證券商代號': '券商代號', '證券商名稱': '券商名稱'}
)
broker_df['券商代號'] = broker_df['券商代號'].astype(str).str.strip()
# 合併券商名稱
df_merged = pd.merge(df, broker_df, on='券商代號', how='left')
# 計算每家券商買進賣出總和
grouped = df_merged.groupby(['券商代號', '券商名稱'], as_index=False)[['買進股數', '賣出股數']].sum()
grouped['買賣超'] = grouped['買進股數'] - grouped['賣出股數']
grouped = grouped.sort_values('買賣超', ascending=False)
# 取前15名、後15名
top_15_buy = grouped.head(15)
top_15_sell = grouped.tail(15).sort_values('買賣超')
print("主力買超前15名:")
print(top_15_buy[['券商名稱', '券商代號', '買進股數', '賣出股數', '買賣超']])
print("\n主力賣超前15名:")
print(top_15_sell[['券商名稱', '券商代號', '買進股數', '賣出股數', '買賣超']])
8. 總結
- 用 2captcha 可以輕鬆
自動輸入驗證碼,解決網頁爬蟲大難題
。 - 抓券商分點資料後,依據買進減賣出就能判斷主力進出排行。
- 後續還能
根據成交單價分析
主力成本,或是結合更多天數比對,做出進階分析。
如果你也想學習自動化股市資訊分析,可以參考這篇流程,有問題歡迎留言交流!
#台股 #主力券商 #分點分析 #驗證碼破解 #2captcha #Python爬蟲 #自動化 #證交所 #數據分析 #股票分析 #程式交易 #股票爬蟲 #量化投資