老王今天发现一个爬虫脚本不工作了,看了下日志发现是 Selenium 获取的 cookie 在传给 requests 的时候报错了,本文记录下 Selenium 通过 Chrome 获取 cookie 并传递给 requests 的教程。
一、旧写法报错内容
通用代码:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') driver = webdriver.Chrome(executable_path='/root/chromedriver', options=chrome_options)
这是之前老王的 cookie 传递方法,用的 cookiejar_from_dict
方法将由 Selenium 得到的 cookies 直接转成 requests.Session() 需要的格式:
session = requests.Session() driver.get(url) cookies = driver.get_cookies() session.cookies = requests.utils.cookiejar_from_dict(cookies) resp = session.get(url)
报错:TypeError: list indices must be integers or slices, not dict
二、修改后的传递方法
修改后的代码,借助 RequestsCookieJar
逐一手动添加 Cookie 的 name 和 value:
session = requests.Session() driver.get(url) cookies = driver.get_cookies() jar = RequestsCookieJar() for cookie in cookies: jar.set(cookie['name'], cookie['value']) session.cookies = jar resp = session.get(url)
修改后爬虫脚本就能正常运行了。