iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
AI & Data

網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術系列 第 28

【Day 28】- 這個驗證碼有點難破解(應對反爬蟲技術-驗證碼篇)

  • 分享至 

  • xImage
  •  

前情提要

昨天使用了 Dcard 的 API 來爬取 Dcard 上面的文章。

開始之前

各位開始在撰寫爬蟲後,常常會遇到一些網站刻意的擋掉爬蟲,這種擋掉爬蟲的設計稱為反爬蟲技術。

最常見的反爬蟲技術莫過於驗證碼了。我反爬蟲會分兩篇來討論,今天這篇會專注於驗證碼的部分。

驗證碼

驗證碼英文稱為 Captcha,是一種區分用戶是機器或人類的公共全自動程序。

常見的有

以及 Google 發行的 reCAPTCHA

可能有些讀者會發現 Google 發行的 reCAPTCHA 有時候會需要二次驗證,有時候不用。事實上,如果演算法檢測到當前系統存在風險,比如可能是陌生的網路環境,可能是模擬程式,就會須要二次驗證。

應對

要應對驗證碼有幾個方法,以下列出。

  • 人工輸入驗證碼

  • 模擬人類動作(reCAPTCHA )

  • OCR 辨識驗證碼

  • 第三方平台驗證碼辨識服務

  • User Session

  • 人工輸入驗證碼

此應對方法十分直觀,就是當遇到需要驗證碼的地方時,就用類似 input() 的步驟將其停住,把圖片載下來,人工輸入驗證碼,之後繼續爬取。

  • 模擬人類動作(reCAPTCHA)

這個應對方法常用於 Selenium 爬取時遇到 reCAPTCHA ,往往會需要這種會渲染網頁 JavaScript 或在網頁停留、捲動一段時間,而後點擊 I'm not a robot 。

  • OCR 辨識驗證碼

此應對方法主要是將驗證碼的圖片使用 OCR 文字辨識。

Python 常用的 OCR 為 pytesseract。

pipenv install pillow
pipenv install pytesseract

pytesseract 需要下載Tesseract執行檔,各位要記得安裝路徑,等等在 Python 程式中需要指定該路徑。

載點 : https://github.com/UB-Mannheim/tesseract/wiki

from PIL import Image
import pytesseract

if __name__ == '__main__':
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    img = Image.open('img.png')
    text = pytesseract.image_to_string(img)
    print(text)
  • 第三方平台驗證碼辨識服務

有許多提供這類服務的平台,這邊推薦 Anti-captcha,以量計費,如果需求不多,可以使用很久。

  • User Session

先使用瀏覽器先行登入,之後將 Session 匯出,使爬蟲帶上該 Session , 便可以達到不使用帳號密碼登入的效果,自然就不需要面對驗證碼。

本次鐵人賽有兩篇文章用到此技巧。

【Day 11】- 還在 PTT 點擊已滿 18 歲? 帶上 cookies 吧!(實戰 PTT 爬蟲 1/3)

【Day 21】- 你的爬蟲還在用帳號密碼進行登入? 帶上 Session 吧!(實戰 Selenium 自動點擊 Instagram 好友貼文贊 1/2)

結語

本次列舉了驗證碼這個反爬蟲技術的應對方法,善用這些方法,可以去迴避掉一些網頁的反爬蟲,如果遇到了還是無法用以上方法應對的狀況,可以考慮換個爬蟲架構,或繼續深入優化 OCR 或者一些資安方面繞過手法。

明日內容

明天會帶各位看一下常見的反爬蟲技術。

補充資料

Python 進階爬蟲技巧- Selenium + Anti-captcha 圖片驗證碼破解 : https://medium.com/@keigi1203/python-進階爬蟲技巧-selenium-anti-captcha-圖片驗證碼破解-b9486df79aa7


上一篇
【Day 27】- 再爬一次 Dcard ?(實戰向 Dcard API 發出請求)
下一篇
【Day 29】- 應對反爬蟲技術-綜合篇
系列文
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-14 12:32:36

恭喜即將邁入完賽階段~

我要留言

立即登入留言