爬虫时遇到status_code为 412,怎么办
错误是什么:
HTTP 412错误,(Precondition failed),是HTTP协议状态码的一种,表示“未满足前提条件”。如果服务器没有满足请求者在请求中设置的其中一个前提条件时就会返回此错误代码。
412错误一般是由于要查看的网页设置了先决条件,一般是网页中有一个或多个请求标题字段中具有先决条件,这些字段经服务器测试后被认为是”FALSE”。客户端为当前资源的meta信息(头文件字段数据)设置了先决条件,以便防止请求的方法被用于指定资源外的其他资源,因此该请求无法完成而出现的错误。
412错误怎么解决:
一、尝试一:添加headers
判断出问题出在请求头上以后,下面我们尝试把网页的所有请求头都带上,注意:这里带的是全部字段,尤其是cookie字段。
添加cookie有2种方式:
-
- 添加在headers里
- 添加在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文件。