Python中Scrapy框架的Cookie导入方式请教?
本人刚接触scrapy,主要看中了能暂停,继续,去查这几点,以前一直用requests或者requests-html,所以都是这样处理cookie的:
headers = {
'Accept-Language':'zh-CN',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
# dummy:
"cookie":"__cfduid=d2ea661e4cddec1eebedc2c54d78e6156698409;__utma=50351329.433346.1527221979.1527221979.1527221979.1;__utmc=501329;__utmz=501329.15271979.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);__51cke__=;__51laig__=1;__tins__3878067=%7B%22sid%22%3A%201527221980323%2C%20%22vd%22%3A%201%2C%20%22expires%22%3A%201527223780323%7D;91username=regf3qc;CLIPSHARE=n9u906378onmf990kdlpq3;DUID=15fdcQq0vvU0U10%2FdVsdg5smxiBM18RO%2FQ5O3uuV%2F3pe;EMAILVERIFIED=no;language=cn_CN;level=1;remainclosed=1;user_level=1;USERNAME=1a9dkmjCzR6TueiJdjZzM6gIUE8AXAHzxIuxb4x6vEk;",
}
r = requests.get(‘http://example.com’,headers=headers)
但是看scrapy文档的话是把cookie和header分开输入的,而且cookie还只能用 dict 输入。上面的cookie直接用EditThisCookie导出就可以了。cookie不是包含在了header里面了吗?在scrapy里这样写似乎也没用:
class PornSpider(scrapy.Spider):
name = 'pron'
def start_requests(self):
urls = ['http://pron.com/page={}'.format(i) for i in range(1,3)]
for url in urls:
yield Request(url,callback=self.parse,headers=headers) #这样似乎是没有用的, 返回的应该是不带 cookie 的页面
scrapy看起来比自己写方便很多,那想请教下能不能用requests库取代scrapy自带的Request呢?或者有没有更优雅的cookie导入方法呢?
谢谢大家
Python中Scrapy框架的Cookie导入方式请教?
在Scrapy里处理Cookie,主要有三种方式,看你的具体需求来选。
1. 直接用 cookies 参数(最直接)
在 Request 里直接传一个字典。适合手动测试或固定Cookie。
yield scrapy.Request(
url='http://example.com',
cookies={'session_id': 'abc123', 'token': 'xyz789'},
callback=self.parse_page
)
2. 用 Request 的 cookies 参数配合 start_requests(动态生成)
在 start_requests 方法里构造请求,可以灵活生成或读取Cookie。
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
# 这里可以从文件、数据库或登录接口获取Cookie
my_cookies = {'session_id': 'your_session_here'}
yield scrapy.Request(url, cookies=my_cookies, callback=self.parse)
3. 启用 CookiesMiddleware 并设置 Request 的 meta(自动处理会话)
这是最常用、最强大的方式。Scrapy默认就启用了 CookiesMiddleware,它会自动处理服务器返回的 Set-Cookie,并在后续请求中携带,维持会话状态。你只需要确保请求是按顺序发出的。
import scrapy
class LoginSpider(scrapy.Spider):
name = 'login_example'
start_urls = ['http://example.com/login']
def parse(self, response):
# 1. 先提交登录表单
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'user', 'password': 'pass'},
callback=self.after_login
)
def after_login(self, response):
# 2. 登录成功后,后续请求会自动使用相同的Cookie会话
if "logout" in response.text:
yield scrapy.Request('http://example.com/dashboard', callback=self.parse_dashboard)
这种方式下,CookiesMiddleware 会自动管理Cookie jar,你无需手动干预。如果网站有复杂的验证流程(如CSRF token),你可能需要在 FormRequest 中先提取并提交。
总结建议
需要维持登录状态就用 CookiesMiddleware,传固定Cookie就直接用 cookies 参数。
def start_requests(self):
cookies = settings.weibo_cookies (字典)
#cookie 登录
return [FormRequest(self.start_urls[1], cookies=cookies, formdata={}:这个参数是请求的 body,callback=self.parse)]
注意缩进。

