直接给出答案:注释掉COOKIES_ENABLED
解释COOKIES_ENABLED作用:
- 当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
- 当COOKIES_ENABLED没有注释设置为False的时候scrapy默认使用了settings里面的cookie
- 当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie
补充:downloader中间件下如何实现请求携带cookie
在scrapy项目中的middlewares文件中添加如下代码:
class CookieMiddleware(object):
def __init__(self):
self.coll = db.conn['book_rwyxw_crawl']['login_cookies']
def process_request(self, request, spider):
if spider.name == 'refer_detail_spider':
cookie_str = str(self.coll.find_one({'uid': '1'}, {'_id': 0})['cookies'])
cookie_list = cookie_str.split('=')
print(cookie_list[0], cookie_list[1][:-1])
request.cookies = {
cookie_list[0]: cookie_list[1][:-1]
}
上面的代码,不用具体纠结是什么意思(这是我从mongo里拿对应账户的cookie),你只要知道创建一个中间件类CookieMiddleware(名字随便), 然后在定义的process_request方法中写你添加cookies的逻辑就好。
注意:通常返回给你的cookie是一个像下面的字符串,你需要去切分出来,给request.cookies传递字典或者json格式的数据
JSESSIONID=7E13FFCA22B71B3B28CBD397163AB5D4; UniqueID=DYR5OYcUdC2PG6OG1604986933643; Sites=_20003; right_status=1; left_status=0; undefined_vq=192
下面函数为将cookies字符串转化成dict
def transform(cookies):
cookie_dict = {}
cookies = cookies.replace(' ','')
lis = cookies.split(';')
for i in lis:
key = i.split('=')[0]
value = i.split('=')[1]
cookies_dict[key] = value
return cookies_dict