怎麼繞過驗證碼? 利用 2Captcha 驗證碼識別服務突破  reCAPTCHA 驗證碼,抓取證券櫃買中心的券商買賣證券日報表上分點交易資訊

  • LargitData
  • 2021年6月29日 02:51

有在操作股票的朋友們一定知道,證券櫃買中心的券商買賣證券日報表上包含了每日上櫃股票的分點交易資料,透過研究分點資料,便可以分析大戶進出行為,進而跟單獲利。但是券商買賣證券日報表上面埋有reCAPTCHA驗證碼,透過一堆圖片驗證題目,阻止我們的自動化網路爬蟲大軍去上面大量撈取資料。 但reCAPTCHA 驗證碼怎麼識別? 因此大數軟體 X 大數學堂,今天就要教你該如何撰寫一Python網路爬蟲,再搭配2Captcha驗證碼識別服務,便可以輕輕鬆鬆突破券商買賣證券日報表上的 reCAPTCHA 驗證碼服務,順利抓取分點交易資訊。


 

首先,我們想要了解如何透過Python 網路爬蟲了解如何抓取買賣證券日報的資料。因此我們採取以下步驟,尋找帶有我們所需資料的請求連結:

  1. 1. 打開 Chrome 瀏覽器,連結至證券櫃買中心的券商買賣證券日報表(https://www.tpex.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw)

 

 

  1. 2. 點擊滑鼠右鍵,點選檢查

 

  1. 3. 將開發人員工具的頁籤切換到 Network

 

  1. 4. 點擊「我不是機器人」、鍵入股號: e.g. 1240,按下「查詢」


 

  1. 5. 複製頁面上看到的文字 (e.g. 2,023,771),貼到搜尋框中按搜尋,點擊搜尋框中有用藍色底色標注的文字區域

 

  1. 6. 找到回應內容後(Response),切換到標頭(Headers),尋找到對應的請求連結

 


 

  1. 7. 可以從Request Method 中發現Requset URL為 (https://www.tpex.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw),而存取方法是用POST 方法


 

  1. 8. 捲動捲軸,找到POST 帶的Form Data,可以發現參數列除了股票代號(stk_code:1240)外,還帶有g-recaptcha-response 這段字串



 

好了,現在問題來了。我們知道 stk_code 裡面要填的是股票的代號,但是g-recaptcha-response 裡面該填什麼呢? 我們可以猜想g-recaptcha-response 裡面填的應該是 reCAPTCHA 的Token,但問題是,應該要如何取得reCAPTCHA 的 Token 呢? 

 

聰明的你應該可以想得到,這時候我們應該要透過點選頁面上「我不是機器人的」的選擇框,才能獲得 Token ,這段我們可以透過 SeleniumPyAutoGUI 自動化。但是如果你真的模擬點了幾次後,這時 reCAPTCHA 最煩人的驗證機制 - 圖片驗證,要你從九宮格中選出正確圖片的題型就會開始跳出來。

 

驗證碼怎麼識別

該怎麼繞過驗證碼? 當然如果你熟悉深度學習技術的話,你可以用影像識別技術突破這一段,但該怎麼蒐集要訓練的影像資料?怎麼訓練影像辨識模型?一共要花多少時間?卻變成一個大難題,讓現在寫網路爬蟲的,還要懂得AI 才能搞。

 

reCAPTCHA 驗證碼

 

驗證碼識別服務

這時,好用的驗證碼識別服務2Captcha,就派上用場啦 !你可以先到 2Captcha 的官網 ( 點選我的推薦連結)。在註冊一個會員後,接者登入後,根據指示入金。

 

2Captcha 服務

 

根據官網說明,該服務破解1,000 個普通驗證碼收費 0.78 美元(約21.76 元台幣),也就是說破解一個驗證碼只要 0.02176 元台幣:而破解1,000 個reCatcha 也只收費 2.99 美元(約83.45 元台幣),價格可以說是非常划算。

 

如果你想靠幫人在網路上點驗證碼賺點外快的話,他們也有提供在網賺方案。(不過點一千個才0.4 美金,對時間寶貴的人可說不划算。)

 

 

在登入後,也入金的情況下,你可以在使用者的儀表板頁面 (2Captcha.com/enterpage">https://2Captcha.com/enterpage) 下識別(Recognition)的區塊找到個人的 API KEY(紅色字部分) ,你可以將該 API Key 複製起來,作為待會網路爬蟲破解之用。

API KEY

 

等一切就緒後,就開始我們的破解流程。

 

  1. 1. 進到要破解頁面 (https://www.tpex.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw) 

 

 

  1. 2. 在頁面上點選滑鼠右鍵,選擇檢視原始碼 (或按 ctrl + U)


 

  1. 3. 用 ctrl + f 搜尋關鍵字g-recaptcha (橘色的部分)並找到後面的 data-sitekey (藍底選擇的部分)

 

  1. 4. 或用requests 搭配 BeautifulSoup 直接找出 data-sitekey 

 

import requests
from bs4 import BeautifulSoup

pageurl = 'https://www.tpex.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw'
res1 = requests.get(pageurl)
soup = BeautifulSoup(res1.text)
googlekey = soup.select_one('.g-recaptcha').get('data-sitekey')

 

  1. 5. 將 pageurl, googlekey 跟 2catcha 驗證碼識別服務的 key 當成參數,輸入至 2Captcha 的API 接口 (2Captcha.com/in.php">http://2Captcha.com/in.php),更多說明可以參閱說明文檔 (2Captcha.com/2Captcha-api">https://2Captcha.com/2Captcha-api)


 

res2 = requests.get(f'http://2Captcha.com/in.php?key={key}&method=userrecaptcha&googlekey={googlekey}&pageurl={pageurl}')
print(res2.text)

 

  1. 6. 如果回傳結果帶有 OK 字串(e.g. OK|67361246930),則 | 右邊的數字為此次驗證批次的ID,我們需要將ID與key 當作參數,輸入給產生驗證結果的 API 端口 (2Captcha.com/res.php">http://2Captcha.com/res.php) 

 

rid = res2.text.split('|')[1]
res3 = requests.get(f'http://2Captcha.com/res.php?key={key}&id={rid}&action=get')
print(res3.text)

 

  1. 7. 如果回傳結果帶有 OK 字串(e.g. OK|03AGdBq26JC9X-),則 | 右邊的字串即為 reCAPTCHA 的 g-recaptcha-response Token,我們最後只要用該 Token 搭配股票代號作為查詢條件,便可以突破reCAPTCHA 的限制,讓我們輕鬆獲得分點資訊。

payload = {
   'g-recaptcha-response': res3.text.split('|')[1],
   'stk_code': '1240'
}
res4 = requests.post('https://www.tpex.org.tw/web/stock/aftertrading/broker_trading/brokerBS.php?l=zh-tw', data = payload)

 

  1. 8. 最後再用 Pandas 整理資料

import pandas
dfs = pandas.read_html(res4.text)
dfs[2].columns = dfs[2].iloc[0]
df1 = dfs[2].drop(0)

dfs[3].columns = dfs[3].iloc[0]
df2 = dfs[3].drop(0)

df = pandas.concat([df1, df2]).set_index('序號')

df

 

 

大功告成,最後你應該可以看到如下圖的抓取結果。透過2Captcha 的驗證碼識別服務,的確能夠輕鬆解決reCAPTCHA驗證碼。如此一來,我們就能夠每日追蹤大戶的買賣明細,再加以分析後,便能根據大戶的買賣數據,拒當韭菜,賺取獲利歐!

 

 

附上本文章程式碼可以於我的 Github (https://github.com/ywchiu/largitdata)下找到 ,如果想要了解更多網路爬蟲相關知識,請關注大數學堂,與大數軟體粉絲頁

 

本文章是由 2Captcha驗證碼識別服務 贊助撰寫,如有技術合作或業務合作事宜,可以直接透過EMAIL 聯絡我歐