用 2captcha 破解驗證碼,輕鬆抓取台股券商分點買賣日報

BY PJ. -2025 年 4 月 26 日
(最後更新於: 2025 年 5 月 10 日)


台股券商分點日報,是觀察主力買賣動向的實用工具。不過,證交所的查詢網站會要求輸入驗證碼,對爬蟲來說很不方便。這篇文章就要教你怎麼用 2captcha 這個工具自動破解驗證碼,再結合 Python 抓下主力券商進出排行,讓你快速得到分析資料。



1. 什麼是 2captcha?

2captcha 是一個提供「真人幫你解驗證碼」的服務。你只要用 API 把驗證碼圖片上傳,幾秒鐘內就能拿到正確答案,不用自己訓練 AI 模型,遇到圖片換來換去也沒差。

  • 每次辨識費用超便宜(約 0.001 美元)
  • 多種驗證碼都能破解,速度約 10 秒內。
  • 適合自動化抓資料用。

2captcha機制


2. 申請帳號與準備 API KEY

  1. 前往 2captcha 官網 註冊帳號。
  2. 儲值一點點金額(最低 3 美元就夠用很久)
  3. 登入後到 dashboard > API Keys 取得你的 API Key

2captcha儲值


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[['券商名稱', '券商代號', '買進股數', '賣出股數', '買賣超']])

2330主力買超


8. 總結

  • 用 2captcha 可以輕鬆自動輸入驗證碼,解決網頁爬蟲大難題
  • 抓券商分點資料後,依據買進減賣出就能判斷主力進出排行。
  • 後續還能根據成交單價分析主力成本,或是結合更多天數比對,做出進階分析。

如果你也想學習自動化股市資訊分析,可以參考這篇流程,有問題歡迎留言交流!


#台股 #主力券商 #分點分析 #驗證碼破解 #2captcha #Python爬蟲 #自動化 #證交所 #數據分析 #股票分析 #程式交易 #股票爬蟲 #量化投資

💬 留言區