1. 反機器人技術:是誰和我們玩貓捉老鼠的遊戲?
今天,我們將探索 web-scraping 中最有趣且可以說是最具爭議的話題之一——繞過機器人防護以及對抗 CAPTCHA。 如同程式設計師生活中經常出現的情況,每個狡猾的螺栓都有一個相對應的左旋螺帽,我們來看看如何應對這些挑戰吧。
在我們開始尋找漏洞之前,先來了解我們面對的問題是什麼。反機器人技術並不過是用來保護網站免於過度(往往是不受歡迎的)自動程式存取的系統。以下是一些常見的方法:
- CAPTCHA:CAPTCHA 就像是反機器人世界中的核武器。 目的是透過要求完成需要人類參與的任務(例如選擇所有有柴犬的圖片或輸入模糊的字母組合)來篩選出機器人的請求。
- 行為分析:一些網站會根據你填寫表單的速度或與網頁元素互動的方式來做出判斷。 太快了嗎?那你可能會被懷疑,然後被封鎖。
- 延遲和請求限制:如果網站懷疑你不是人類,它可能會增加請求之間的延遲甚至封鎖你的存取。
2. 繞過反機器人的方法
現在,我們已經認識了敵人,讓我們來看看一些可能繞過的方式。
解決 CAPTCHA
最明顯但同時也是最困難的方法,就是自動解決 CAPTCHA。這是可行的,但需要某些工具或第三方服務。CAPTCHA 有多種類型,包括文字、圖形甚至語音 CAPTCHA。
要自動解決 CAPTCHA,可以使用像 2Captcha 或 Anti-Captcha 這樣的 API 服務,這些服務會收取些許費用。讓我們看看這在實際操作中是如何實現的:
import requests
def solve_captcha(api_key, site_url, captcha_image_url):
# 下載 CAPTCHA 圖片
captcha_image = requests.get(captcha_image_url).content
# 將圖片上傳到服務並獲得任務 ID
response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
captcha_id = response.text.split('|')[1]
# 獲取 CAPTCHA 的答案
solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
solution_response = requests.get(solution_url)
while 'CAPCHA_NOT_READY' in solution_response.text:
solution_response = requests.get(solution_url)
return solution_response.text.split('|')[1]
# 使用函數的範例
api_key = '您的_2CAPTCHA_KEY'
site_url = 'https://example.com'
captcha_image_url = 'https://example.com/captcha_image'
captcha_solution = solve_captcha(api_key, site_url, captcha_image_url)
print("CAPTCHA 的解答:", captcha_solution)
這段程式碼展示了如何請求解決 CAPTCHA。但對於複雜的圖形任務,或網站經常改變演算法時,這些方法可能不太有效。
模仿人類行為
另一種欺騙方法是模仿人類行為。你可以在腳本中隨機添加延遲、更改 user-agent、模擬雙向互動,甚至使用 Selenium 模擬鼠標移動:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://example.com')
# 模擬鼠標移動
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()
# 添加延遲以模擬自然互動
time.sleep(2)
# 執行操作
element.click()
關於 Selenium 的詳細內容,我們會在後續講座中介紹。
使用動態 IP 和代理
你還可以使用代理伺服器更改發送請求的 IP 地址。這可以幫助繞過每個單一 IP 限制請求數量的方法。有像 Bright Data 和 Smartproxy 這樣的服務可供使用。
import requests
proxy = {
"http": "http://123.456.789.012:8080",
"https": "http://123.456.789.012:8080",
}
response = requests.get('https://example.com', proxies=proxy)
print(response.content)
3. 重要注意事項
繞過反機器人的實現需要知識與實驗。重要的是要記住,不是所有方法都是合法的或者被網站接受的。請務必檢查哪些內容被 "robots.txt" 所允許,並遵守 Web Scraping 的好習慣,避免超載伺服器。這不僅能避免法律問題,也是一種對他人工作的尊重。
切勿用你的家庭 IP 執行任何重大爬蟲。學習性質的爬蟲不會有什麼問題,但如果你的腳本意外同時發送了數千個請求,導致某個伺服器癱瘓,那你可能會被關注。隨之而來的,就是有人找上門問你問題。
GO TO FULL VERSION