对于一些网站需要实时获取cooikes才可以爬取可以使用selenium来进行实时获取网站的cookies
在scrapy不仅可以在spider中直接使用selenium,还可以通过中间件来实现。
首先编写middleware.py
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
class cookiesMiddleware:
def __init__(self):
self.cookies = self.get_cookie()
def get_cookie(self):
opt = webdriver.ChromeOptions()
#设置selenium时,启动时浏览器不弹出
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=opt)
# 加载页面
driver.get(‘https://btc.com/’) #这边填写能获取到网站cookies的网址
time.sleep(4)
# 由于我获取cookie的页面页面无需用户登陆,所以直接获取cookies
# Selenium为我们提供了get_cookies来获取登录cookies
cookies = driver.get_cookies()
cookie = {}
# scrapy使用cookies需要封装成dict,所以在这边将获取到的cookies处理成dict类型,方便使用
for s in cookies:
cookie[s['name']] = s['value']
# 获取到数据后关闭浏览器
driver.close()
return cookie
def process_request(self, request, spider):
request.cookies = self.cookies
return None
设置sttings
#当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
#当COOKIES_ENABLED没有注释设置为False的时候scrapy默认使用了settings里面的cookie
#当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie
COOKIES_ENABLED = True
#激活中间件
DOWNLOADER_MIDDLEWARES = {
'projectname.middleware.cookiesMiddleware': 300,
}
这样子在使用Request请求是就会带上我们自定义获取的cookies
注意:自定义cookies的时候需要将COOKIES_ENABLED设置为True