爬⾍碰到状态码412的解决办法
爬⾍碰到状态码412
近期在使⽤python的requests库爬取⽹页时,碰到返回状态码为412的情况
状态码412含义为:Precondition Failed,服务器在验证在请求的头字段中给出先决条件时,没能满⾜其中的⼀个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求⽅法被应⽤到其希望的内容以外的资源上。
⼀、尝试⼀:添加headers
判断出问题出在请求头上以后,下⾯我们尝试把⽹页的所有请求头都带上,注意:这⾥带的是全部字段,尤其是cookie字段。
添加cookie有2种⽅式:
1. 添加在headers⾥
headers ={"User_Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", "Cookie":"复制粘贴相应的cookie "
}
response = (url, headers = headers )
2.分开并单独添加cookie和headers
# 设置headers
headers ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
}
# 设置cookies
cookies ={}selenium获取cookie
cookies['mall']='1638237165.7.1148.523814'
cookies['JSESSIONID']='7D7F08E6CAC6989FDE82EBDEBBF9CB21'
# 发起请求
http_response = requests.post(url_http, cookies=cookies, headers=headers, timeout=5)
这⾥我⽤的是第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)
"source":"""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
return driver
driver = getDriver()
然后就可以成功打开页⾯并获取页⾯内容了。
三、未尝试:结合使⽤selenium和requests
使⽤selenium模拟获取cookie保存为本地⽂件并不断更新,使⽤requests库爬取,调⽤本地cookie⽂件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。