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文档的话是把cookieheader分开输入的,而且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导入方式请教?

3 回复

在Scrapy里处理Cookie,主要有三种方式,看你的具体需求来选。

1. 直接用 cookies 参数(最直接)Request 里直接传一个字典。适合手动测试或固定Cookie。

yield scrapy.Request(
    url='http://example.com',
    cookies={'session_id': 'abc123', 'token': 'xyz789'},
    callback=self.parse_page
)

2. 用 Requestcookies 参数配合 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 并设置 Requestmeta(自动处理会话) 这是最常用、最强大的方式。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)]

注意缩进。

回到顶部