楔子
在爬蟲中進行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文件 https://fake-useragent.herokuapp.com/browsers/0.1.11 '''
既然是在線的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 庫時報錯的解決方法