---
# System prepended metadata

title: 破解反爬蟲技巧
tags: [爬蟲與自動化]

---

# 破解反爬蟲技巧

## 自我檢查

大多數網站都會有反爬的功能, 若是被擋住可以使用以下幾個網站確認哪些訊息讓你被辨識成爬蟲。

### 檢測瀏覽器是否能被檢查為機器人

適用於 selenium 等自動化瀏覽器工具, browserscan 還有許多檢測工具可以自行檢測。

[browserscan-robot](https://www.browserscan.net/tc/bot-detection)

![image](https://hackmd.io/_uploads/BkYbm8ONkx.png)

### ip 偵測

針對會封鎖境外 ip、proxy ip、vpn 等的網站, 可以到以下網站確認自己可能被封鎖的原因。

[browserscan-ip](https://www.browserscan.net/tc/ipcheck)

![image](https://hackmd.io/_uploads/B1QHVL_Nkx.png)


## 攻防實錄

### 擋境外 ip、proxy ip 以及 UA 檢測

目標網站 : https://www.wantgoo.com/investrue/0000/daily-candlestick

![image](https://hackmd.io/_uploads/SkXK_IdVye.png)


該網址可以取得每天的台股加權指數, 若是直接用瀏覽器開啟則可能會出現 ==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
```