scrapy使用cookie的三种方式

文章转载于 安卓逆向菜鸟修炼记(微信公众号),个人感觉很实用,记录下来方便回顾,想看原文的请移步公众号。

1.如果是在headers中使用(这里的cookie是字符串的形式)

def start_requests(self):
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
        "cookie":"你的cookie"
    }
    url = "https://weibo.com/u/{}".format("你的微博id")
    yield Request(url, callback=self.parse, headers=headers)

那么需要把settings.py的COOKIES_ENABLED设置为false

COOKIES_ENABLED = False

2.如果使用cookies=cookies的方式设置cookie(这里的cookie是字典的形式),个人比较习惯用第二种方式

def start_requests(self):
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
    }
    url = "https://weibo.com/u/{}".format("你的微博id")
    yield Request(url, callback=self.parse, headers=headers,cookie="你的cookie")

那么需要把settings.py的COOKIES_ENABLED设置为true

COOKIES_ENABLED = True

3.多个url使用cookiejar
此方法也受COOKIES_ENABLED=True的影响

代码示例

class CookieTestSpider(scrapy.Spider):
    name = 'usecookie'
    cookie_dict = {
        "SUB": "你的微博cookie"}
    headers = {
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
    }
    weibo_id = "你的微博主页id"
    def start_requests(self):
        url = "https://weibo.com/u/{}".format(self.weibo_id)
        yield Request(url, callback=self.parse, headers=self.headers, cookies=self.cookie_dict, meta={'cookiejar': 1})

    def parse(self, response):
        source = response.text
        url = "https://weibo.com/u/{}".format(self.weibo_id)
        if u"我的主页" in source:
            print "找到了"
            yield scrapy.Request(url, headers=self.headers, meta={'cookiejar': response.meta['cookiejar']},
                                 callback=self.parse_page, dont_filter=True)
        else:
            print "没有cookie"

    def parse_page(self, response):
        source = response.text
        if u"我的主页" in source:
            print "又找到了"
        else:
            print "没有cookie"

首先在start_requests中,在meta里添加一个cookiejar属性,这个键必须这个名,然后是后面值可以从0开始,如果多个start_url可以使用列表的里url对应的下标作为cookiejar的值,
程序可以通过传入的不同值传递多个start_url的cookie。
后面需要使用cookie地方使用meta={‘cookiejar’: response.meta[‘cookiejar’]}即可。
这种方法的好处:

这种是通过meta的方式,将为spider维护多个独立的cookie会话。如果使用cookies ={},则必须手动维护单独的cookie会话。
下面这个图是cookiejar的调用栈
在这里插入图片描述

### 设置和管理Scrapy中的CookieScrapy 中,`COOKIES_ENABLED` 配置项用于控制框架如何处理 cookies。当此选项被设置为 `True` 时,Scrapy 将自动接收并存储来自 HTTP 响应的 cookie,并将其发送给后续请求[^1]。 对于更复杂的场景,比如需要管理多个会话或自定义 cookie 行为的情况,则可以利用中间件功能。具体来说,Cookies Middleware (`scrapy.downloadermiddlewares.cookies.CookiesMiddleware`) 负责维护一个 `http.cookiejar.CookieJar` 实例列表,从而支持多会话下的 cookie 管理[^3]。 为了更好地调试和理解 cookie 的流动情况,在 `settings.py` 文件中还可以开启 `COOKIES_DEBUG` 参数,这会让 Scrapy 打印出所有接收到以及即将发出的 cookie 信息[^4]。 下面是一个简单的例子展示怎样配置这些参数: ```python # settings.py COOKIES_ENABLED = True # 启用 Cookie 处理机制 COOKIES_DEBUG = True # 开启 Cookie 调试模式 ``` 如果想要向特定 URL 发送预设好的 cookie 数据,可以在发起 Request 请求的时候传递字典形式的 cookies 参数: ```python import scrapy class ExampleSpider(scrapy.Spider): name = "example" def start_requests(self): yield scrapy.Request( url='https://www.example.com', cookies={'currency': 'USD', 'country': 'US'}, callback=self.parse, ) ``` 此外,也可以通过重写 Spider 类的方法 `_set_cookie()` 或者直接操作 `response.meta['cookiejar']` 来动态调整某个响应所关联的 cookie jar[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值