在使用requests进行爬虫的时候,很多时候回遇到反爬,其中一个就是cookie会动态变化,如何解决cookie动态变化呢?
当遇到此类反爬的时候,可以使用selenium来解决,selenium是一个使用代码操作浏览器的自动化工具,它可以模拟人操作电脑。
安装selenium
pip install selenium
先使用selenium获取到网页动态的cookie,然后再使用requests将cookie拼接到headers中,整个代码及解释如下:
import selenium
import requests
# 使用浏览器开发者模式,配置实验性功能参数
option = webdriver.ChromeOptions()
#设置此属性,浏览器不会弹请禁用开发者模式的弹框
option.add_experimental_option('useAutomationExtension', False)
# 设置开发者模式启动,该模式下webdriver属性为正常值,如果不设置,某些网站会检测出window.navigator.webdriver属性,该属性是会被网站认为是爬虫程序,因此隐藏该属性
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome("XXX:\Google\Chrome\Application\chromedriver.exe", options=option)
#此处使用郑州商品交易所举例,该网站不光cookie动态变化,而且会进行window.navigator.undefined属性的检测
#大家可以先手动点开该网址,在console界面输入:window.navigator.webdriver,会返回undefined
#然后使用程序,将上面隐藏undefined属性的地方注释,然后将下面等待内容多等待会,在打开网页后,再输入window.navigator.webdriver,会发现返回的是true
driver.get("http://www.czce.com.cn/cn/jysj/mrhq/H770301index_1.htm")
# 等待内容加载完成
time.sleep(3)
# 获取cookie
dictCookies = driver.get_cookies()
#获取每个cookie
cookies = [item['name'] + '=' + item['value'] for item in dictCookies]
# 拼接cookie
cookieStr = '; '.join(item for item in cookies)
URL = 'http://www.czce.com.cn/cn/DFSStaticFiles/Future/2021/20210420/FutureDataDaily.htm'
# 引入 requests,将动态cookie存入,其余的请求头这里不再显示
headers = {
'Cookie':cookieStr
}
res = requests.get(URL, headers=headers)
res.encoding='utf-8'
r=res.text
print(r)