爬蟲時遇到status_code為 412,怎麼辦
錯誤是什麼:
HTTP 412錯誤,(Precondition failed),是HTTP協定狀态碼的一種,表示“未滿足前提條件”。如果伺服器沒有滿足請求者在請求中設定的其中一個前提條件時就會傳回此錯誤代碼。
412錯誤一般是由于要檢視的網頁設定了先決條件,一般是網頁中有一個或多個請求标題字段中具有先決條件,這些字段經伺服器測試後被認為是”FALSE”。用戶端為目前資源的meta資訊(頭檔案字段資料)設定了先決條件,以便防止請求的方法被用于指定資源外的其他資源,是以該請求無法完成而出現的錯誤。
412錯誤怎麼解決:
一、嘗試一:添加headers
判斷出問題出在請求頭上以後,下面我們嘗試把網頁的所有請求頭都帶上,注意:這裡帶的是全部字段,尤其是cookie字段。
添加cookie有2種方式:
-
- 添加在headers裡
- 2.分開并單獨添加cookie和headers
這裡我用的是第1種方法,感覺更友善一點,可以成功獲得傳回的200狀态碼。但現在有了新的問題:
這種方式請求隻可以持續1-2分鐘會傳回200,然後又接着傳回412,看來cookie的時效比較短,需要頻繁更換。這裡我又繼續嘗試了以下2種方法:
二、嘗試二:使用selenium模拟
關于selenium的使用方法這裡不詳細介紹,模拟的時候碰到一個問題,因為我的頁面是重定向跳轉的,這裡并沒有成功打開,需要在driver裡加一些選項,下面的這些選項可以應對大部分的網址:
def getDriver():
options = webdriver.ChromeOptions()
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
#options.add_argument("--no-sandbox") # linux only
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browserClientA"}})
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
return driver
driver = getDriver()
然後就可以成功打開頁面并擷取頁面内容了。
三、未嘗試:結合使用selenium和requests
使用selenium模拟擷取cookie儲存為本地檔案并不斷更新,使用requests庫爬取,調用本地cookie檔案。