# 破解反爬蟲技巧
## 自我檢查
大多數網站都會有反爬的功能, 若是被擋住可以使用以下幾個網站確認哪些訊息讓你被辨識成爬蟲。
### 檢測瀏覽器是否能被檢查為機器人
適用於 selenium 等自動化瀏覽器工具, browserscan 還有許多檢測工具可以自行檢測。
[browserscan-robot](https://www.browserscan.net/tc/bot-detection)

### ip 偵測
針對會封鎖境外 ip、proxy ip、vpn 等的網站, 可以到以下網站確認自己可能被封鎖的原因。
[browserscan-ip](https://www.browserscan.net/tc/ipcheck)

## 攻防實錄
### 擋境外 ip、proxy ip 以及 UA 檢測
目標網站 : https://www.wantgoo.com/investrue/0000/daily-candlestick

該網址可以取得每天的台股加權指數, 若是直接用瀏覽器開啟則可能會出現 ==400 - BadRequest==。
更不用說 requests 直接去 get 該 url, 或是 selenium 了。
該網站的檢測項目:
1. UA 檢測 : 也就是 Headers 的 UserAgent 訊息。
2. 境外 ip 阻擋 : 非臺灣 ip 都會被擋掉。 ==400 - BadRequest==。
3. proxy ip 檢測 : 若使用臺灣 proxy ip(ipv4、ipv6、home proxy) 都還是會被檢測出來
==403 - BadRequest==。
解決方式 :
#### UA 檢測
使用 fake_user_agent 套件產生 random UA 可以有效解決 UA 檢測。
```python=
from fake_useragent import UserAgent
user_agent = UserAgent()
response = requests.get(url,headers={'user-agent': user_agent.random})
```
#### 擋境外 ip
境外 ip 阻擋, 若主機不在臺灣可以使用位於臺灣的 proxy ip 讓自己的 ip 來源看似為臺灣 ip
[前往 ip2world 取得免費 proxy ip](https://www.ip2world.com/free_proxy/?utm-source=ggtg&utm-keyword=?4gfre293&gad_source=1&gclid=Cj0KCQiA0--6BhCBARIsADYqyL8AHVgbRDxesXl6UJS7Xp_9MfDMc6lxI38uXo2wrWvbVLGXr83WQeEaAiwGEALw_wcB)
該網站有免費的 ip, 但因為是多人共用較不穩定, 速度也會有影響, 可以到以下網站購買私人 ip
[前往 proxy-seller 購買 proxy ip](https://proxy-seller.com/zh/personal/orders/)
2 個禮拜 1 個 ip 為 1.69 美金 ~= 55 NTD
在 python requests 中使用 proxy
```python=
# 根據實際 ip 填入以下資料
proxy = {
"http": "http://使用者名稱:使用者密碼@代理 ip:http port",
"https": "http://使用者名稱:使用者密碼@代理 ip:http ports",
}
response = requests.get(url,
headers={'user-agent': user_agent.random},
proxies=proxy)
```
#### proxy ip 檢測
:::warning
注意! 以下方法並非百分百破解所有網站 proxy ip 檢測, 僅供嘗試
:::
提供 headers 的 `'X-Forwarded-For'` 參數為本機 ip --> `'127.0.0.1'`, 讓對方以為是自己發出的請求, 繞過 proxy ip 檢測。
```python=
response = requests.get(url,
headers={'user-agent': user_agent.random,
'X-Forwarded-For': '127.0.0.1'},
proxies=proxy)
```
## 防反爬蟲工具
使用 [scraperapi](https://www.scraperapi.com/) 繞過任何網站,需要訂閱後才能有 APIKEY。
- 高階反機器人繞過
- 智慧 IP 和標頭輪換
- 驗證碼處理
- 指紋管理
```python=
import requests
payload = {'api_key': 'APIKEY', 'url': 'https://httpbin.org/ip'}
r = requests.get('http://api.scraperapi.com', params=payload)
print r.text
```