爬虫碰到状态码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 = requests.get(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 = {}
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)
    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文件。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐