将 Scrapy 中建立的会话 cookie 传递给 Splash 以用于抓取 js 页面

问题描述

首先声明我是 Scrapy 的新手!

我有一个网站,需要先登录才能使用 Scrapy 抓取任何数据。我要抓取的数据是登录后由 JavaScript 生成的。

我已成功使用 Scrapy 登录。我现在的问题是,我已经登录并拥有必要的 cookie 来继续向网站发出请求,当在我想用 Scrapy 抓取的报告页面调用 SplashRequest 时,如何将这些 cookie 传输到 Splash?我读过的文档对我来说很难理解,而且看起来太笼统了。我已经查找了示例,但结果是空白。

我的思维过程是否错误,我应该使用 Scrapy 登录然后将 cookie 传递给 Splash 还是我应该通过 Splash 完成这些操作?如果是这样,我如何在 Splash 中传递用户名和密码变量?

这是我的 Scrapy 代码

import scrapy
from scrapy.http import FormRequest
from scrapy_splash import SplashRequest

class mySpider(scrapy.Spider):
     login_url = 'https://example.com/'
     name = 'reports'
     start_urls = [
     login_url
         ]

def parse(self,response):
    return FormRequest.from_response(response,formdata={
        'username': 'XXXXXX','password': 'YYYYYY'
    },callback = self.start_requests)

def start_requests(self):
    url = 'https://example.com/reports'

    yield SplashRequest(url=url,callback=self.start_scraping)

def start_scraping(self,response):
    labels = response.css('label::text').extract()
    yield {'labeltext': labels}

这暂时被简化,只是为了返回随机标签,以便我知道我已登录并且 Scrapy 正在查看报告。发生的事情是它正在登录,但当然,一旦我调用 Splash 呈现 javaScript 报告,Splash 将被重定向登录而不是转到 example.com/reports 网站。任何帮助或指向正确方向的点都将不胜感激。

TIA

解决方法

好的,像往常一样,经过几个小时的搜索和更多的实验,我找到了答案,现在我支持使用 JS 创建的表中的 Scrapy 抓取登录数据。同样像往常一样,我把事情复杂化了。

下面是我的代码,它基于上面的代码,简单地使用 Splash 登录,然后开始抓取。

这使用工具 SplashFormRequest 而不是 Scrapy 的 FormRequest 来使用 Splash 登录。

import scrapy
from scrapy_splash import SplashFormRequest
from ..items import UnanetTestItem

class MySpider(scrapy.Spider):
    login_url = 'https://example.com'
    name = 'Example'
    start_urls = [
    login_url
        ]

def parse(self,response):
    return SplashFormRequest.from_response(
        response,formdata={
        'username': 'username','password': 'password'
        },callback = self.start_scraping)

def start_scraping(self,response):
#whatever you want to do from here.