楔子
在爬蟲中進行request請求,很多時候,都需要添加請求頭,不然服務器會認為是非法的請求,從而拒絕你的訪問。
import requests
url = 'https://www.zhihu.com/question/315387406/answer/812734512'
response = requests.get(url=url)
print(response.status_code) # 400
在添加請求頭中最常用的就是添加user-agent
來講本次請求偽裝成瀏覽器。
User Agent 中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
那么個人怎么搞這個user-agent
呢,沒錯?八仙過海各顯神通,但一般都是用手來解決個人問題!
import requests
url = 'https://www.zhihu.com/question/315387406/answer/812734512'
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(response.status_code) # 200
但,自從有了fake_useragent
,媽媽再也不用擔心......
from fake_useragent import UserAgent
# 實例化 user-agent 對象
ua = UserAgent()
url = 'https://www.zhihu.com/question/315387406/answer/812734512'
headers = {"user-agent": ua.chrome} # 指定瀏覽器 user-agent
# 或者可以這樣寫
# headers = {"user-agent": UserAgent().random} # 一步到位,隨機生成一個 user-agent
response = requests.get(url=url, headers=headers)
print(response.status_code) # 200
About
什么是fake_useragent?
簡單來說,fake_useragent
就像你的女朋友,能靈活的幫助我們生成user-agent
,從而解放雙手。
install
pip install fake_useragent
update
pip install -U fake-useragent
查看版本
import fake_useragent
print(fake_useragent.VERSION) # 0.1.11
Usage
生成指定瀏覽器的user-agent
import fake_useragent
# 實例化 user-agent 對象
ua = fake_useragent.UserAgent()
# ua.ie
print(ua.ie) # Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)
# ua.msie
print(ua['Internet Explorer']) # Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)
# ua.opera
print(ua.opera) # Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01
# ua.chrome
print(ua.chrome) # Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36
# ua.google
print(ua['google chrome']) # Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36
# ua.firefox
print(ua.firefox) # Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1
# ua.ff
print(ua.ff) # Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0
# ua.safari
print(ua.safari) # Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5
隨機生成user-agent
import fake_useragent
# 實例化 user-agent 對象
ua = fake_useragent.UserAgent()
print(ua.random) # Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36
print(ua.random) # Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)
print(ua.random) # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
每次都能隨機生成一個UA表示,大大增強了爬蟲的真實性。
其他用法
將遠程user agent json文件下載到本地
由於fake_useragent
庫維護的user-agent json文件是在線的:
import fake_useragent
print(fake_useragent.settings.CACHE_SERVER)
''' 網址,其實是個json文件
既然是在線的json文件,那么我們就可將之下載到本地:
from fake_useragent import UserAgent, VERSION
location = './fake_useragent%s.json' % fake_useragent.VERSION
ua = UserAgent(path=location)
如果報錯fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
,重新運行代碼就好。
完事你就會發現在與腳本文件的同級目錄有了一個json文件。
如果僅是想跟新本地已保存的json文件
from fake_useragent import UserAgent
ua = UserAgent()
ua.update()
如果你不想緩存數據庫或沒有可寫文件系統
from fake_useragent import UserAgent
ua = UserAgent(cache=False)
如果不想使用托管的緩存服務器
from fake_useragent import UserAgent
ua = UserAgent(use_cache_server=False)
處理異常
fake_useragent.errors.FakeUserAgentError: Maximum amount of retries
from fake_useragent import UserAgent
# 禁用服務器緩存: use_cache_server=False
headers = {"User-Agent": UserAgent(use_cache_server=False).chrome}
response = requests.get(url=url, headers=headers)
print(response.status_code) # 200
FakeUserAgentError(‘Maximum amount of retries reached’
from fake_useragent import UserAgent
# 法1 禁用服務器緩存: use_cache_server=False
headers = {"User-Agent": UserAgent(use_cache_server=False).chrome}
# 法2 忽略ssl驗證
headers = {"User-Agent": UserAgent(verify_ssl=False).chrome}
# 法3 不緩存數據
headers = {"User-Agent": UserAgent(cache=False).chrome}
response = requests.get(url=url, headers=headers)
print(response.status_code) # 200
fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
from fake_useragent import UserAgent, VERSION
location = './fake_useragent%s.json' % fake_useragent.VERSION
ua = UserAgent(path=location)
我在將在線的json文件寫入到本地時,由urllib.error.URLError: <urlopen error timed out>
引起的報錯,重新運行就好,本地文件也下載完成。
see also: fake_useragent-github | fake_user_agent-pypi | Python爬蟲小技巧之偽造隨機的User-Agent | Python 使用 fake-useragent 庫時報錯的解決方法