(Python)爬蟲偽裝User-Agent - fake_useragent套件

前言

爬蟲程式會消耗網站伺服器系統資源,因此有些網站會檢查偵測網站訪問是否為爬蟲程式,並進一步阻擋爬蟲程式,常見的像是封鎖IP來阻擋請求。

本文介紹一個Python套件fake_useragent,將爬蟲程式偽裝為瀏覽器提出請求訪問網站。

什麼是User-Agent

User-Agnet(使用者代理,簡稱UA),會告訴網站伺服器,你是透過什麼工具(作業系統、瀏覽器名稱、瀏覽器版本、渲染引擎、外掛程式…等資訊)發送請求的。

偽裝User-Agent

我們先來看一下,使用Python requests套件直接提出請求,預設的Header如下:

1
2
3
4
5
import requests

response = requests.get('https://www.google.com)
print(response.request.headers)
{'User-Agent': 'python-requests/2.30.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

預設的User-Agent是python-requests/2.30.0,等於直接告訴對方伺服器我就是Python程式。

所以送出請求前,我們可以先修改User-Agent,偽裝為一般瀏覽器提出的請求,避免被對方識別為爬蟲程式而被封鎖。

fake_useragent套件

fake_useragnet是Python的第三方套件,它可以幫助我們將程式加上Uesr-Agent,偽裝為指定或隨機生成瀏覽器提出訪問網站請求。

安裝fake_useragnet

pip安裝

1
2
3
4
5
6
7
8
# install
pip install fake_useragent

# update
pip install -U fake_useragent

# check version
pip show fake_useragent

Usage

產生指定瀏覽器的User-Agnet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from fake_useragent import UserAgent

ua = UserAgent()

### IE ###
print(ua.ie)
# 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)'
print(ua['Internet Explorer'])
# 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)'
print(ua.msie)
# 'Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320; PPC)'

### Google Chrome ###
print(ua.google)
# 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24'
print(ua.chrome)
# 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.202.0 Safari/532.0'
print(ua['google chrome'])
# 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.209.0 Safari/532.0'

### FireFox ###
print(ua.firefox)
# 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2'
print(ua.ff)
# 'Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6'

### Safari ###
print(ua.safari)
# 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/522.11 (KHTML, like Gecko) Version/3.0.2 Safari/522.12'

### Opera ###
print(ua.opera)
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52'

爬蟲程式最實用的,是要有一定的隨機性,可用random隨機產生Agent-User,範例如下:

1
2
3
4
5
6
7
8
9
10
11
from fake_useragent import UserAgent

ua = UserAgent()

print(ua.random)
print(ua.random)
print(ua.random)

# 'Opera/9.61 (Windows NT 6.0; U; http://lucideer.com; en-GB) Presto/2.1.1'
# 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
# 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4'

爬蟲程式中偽裝User-Agnet範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests
import fake_useragent import UserAgent

# 隨機產生User-Agent
ua = UserAgent()
user_agent = ua.random

# 要爬取的網址
url = 'https://www.xxxxx.com/'

# 開始爬取
response = requests.get(url=url, headers={ 'user-agent': user_agent.random })

if response.status_code == 200:
...
else:
...