我正在尝试抓取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,
)
我能够从端点获取信息,但我认为这不是一个有效的解决方案,因为密钥将来可能会更改,每次发生这种情况时,我都必须更改代码。
是否有任何中间件或类似的东西来处理基本授权凭证?我必须以某种方式设置它吗?
1条答案
按热度按时间fv2wmkja1#
你的
required_header
解决方案几乎是你直接从这个端点获取信息的唯一方法。另一种方法是使用真正的浏览器(Selenium,Splash等)来迭代这个站点(但是会慢很多)。在这种情况下,没有中间件来处理
Authorization
头,因为此头是使用Javascript(例如,检查https://infoelectoral.interior.gob.es/opencms/export/system/modules/com.infoelectoral.mapaleaflet/resources/js/index.js)通过如下命令动态发送的:当然,您可以创建一个脚本,将解析上述Javascript文件的登录/密码,但不能保证网站所有者更改上述片段...