scrapy 使用基本身份验证刮擦终结点

qyyhg6bp  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在尝试抓取this Web。当您在第一个选择器中选择一个选项时,Web将向this后端终结点发送GET请求,然后使用Javascript动态填充下一个选择器选项。我想使用Scrapy执行相同的GET请求,问题是您需要基本身份验证密钥才能访问该终结点。
验证认证会在您第一次造访网页时储存,因此如果您尝试透过浏览器存取该端点,您可以顺利完成。不过,如果您前往私密视窗,直接前往端点而不先造访网页,您会注意到会出现浮动视窗,要求您进行验证。
我试图用Scrapy复制此行为,但当我向端点发送请求时,我得到了401响应。

from scrapy import Spider
from scrapy.http import Request

class MIRSpider(Spider):
    name = 'MIRScrapper'
    allowed_domains = ['infoelectoral.interior.gob.es']
    custom_settings = {
        'SPIDER_MIDDLEWARES': {
            'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': None,
            CustomHttpErrorMiddleware: 50
        }
    }

    start_urls = ['https://infoelectoral.interior.gob.es/opencms/es/elecciones-celebradas/area-de-descargas/']
    types_url = 'https://infoelectoral.interior.gob.es/min/convocatorias/tipos/'

    def parse(self, response):
        yield Request(
            url=self.types_url,
            method='GET',
            callback=self.parse_types,
        )

    def parse_types(self, response):
        print(response)

我不知道如何让Scrapy在第一次访问起始url时获得授权证书,并使用它们来设置第二个请求中的头。我检查了浏览器的网络选项卡,获得了浏览器发送的头中的Authorization字段,并这样使用它:

def parse(self, response):
    required_header = {
        'Authorization': 'Basic YXBpSW5mb2VsZWN0b3JhbDphcGlJbmZvZWxlY3RvcmFsUHJv'
    }
    yield Request(
        url=self.types_url,
        method='GET',
        headers=required_header,
        callback=self.parse_types,
    )

我能够从端点获取信息,但我认为这不是一个有效的解决方案,因为密钥将来可能会更改,每次发生这种情况时,我都必须更改代码。
是否有任何中间件或类似的东西来处理基本授权凭证?我必须以某种方式设置它吗?

fv2wmkja

fv2wmkja1#

你的required_header解决方案几乎是你直接从这个端点获取信息的唯一方法。另一种方法是使用真正的浏览器(Selenium,Splash等)来迭代这个站点(但是会慢很多)。
在这种情况下,没有中间件来处理Authorization头,因为此头是使用Javascript(例如,检查https://infoelectoral.interior.gob.es/opencms/export/system/modules/com.infoelectoral.mapaleaflet/resources/js/index.js)通过如下命令动态发送的:

request.setRequestHeader("Authorization", "Basic "+btoa("apiInfoelectoral:apiInfoelectoralPro"));

当然,您可以创建一个脚本,将解析上述Javascript文件的登录/密码,但不能保证网站所有者更改上述片段...

相关问题