-
-
Notifications
You must be signed in to change notification settings - Fork 409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Propriedade 'allowed_domains' dos raspadores: informação geralmente redundante? #1314
Comments
O peso numérico dessa situação só acontece pois a maior parte dos raspadores usam alguma classe base. Então, acho que, se for para adotar uma solução dessas, pode ser mais interessante atualizar as bases para preencher o Esses casos, trazem um pouco mais de "confiança" pra essa alteração, visto que a URL segue um padrão conhecido e o nome da variável ( |
Implementar a solução em cada classe base pode ser uma possibilidade, e já iria sim enxugar a class BaseGazetteSpider(scrapy.Spider):
# ...
def __init__(self, start_date="", end_date="", *args, **kwargs):
super(BaseGazetteSpider, self).__init__(*args, **kwargs)
if not hasattr(self, "TERRITORY_ID"):
raise NotConfigured("Please set a value for `TERRITORY_ID`")
if not hasattr(self, "allowed_domains"):
self.allowed_domains = self.infer_allowed_domains()
if self.allowed_domains is None:
raise NotConfigured("Please set a value for `allowed_domains`")
# ...
def infer_base_url(self) -> Optional[str]:
# NOTE: O nome desse campo poderia ser padroniado.
known_base_url_fields = ["base_url", "url_base", "BASE_URL"]
for field in known_base_url_field:
url = getattr(self, field, None)
if url is not None:
return url
return None
def infer_allowed_domains(self) -> Optional[List[str]]:
base_url = self.infer_base_url()
if base_url is None:
return None
return [urlparse(base_url).netloc]
|
São 219 spiders que declaram |
Simples e possível é, o problema é se estaria certo resolver assim. A origem dessa situação não é o BaseGazette estar incompleto, pq não é papel de BaseGazette preencher campos. O papel que BaseGazette cumpre é meio que garantir que os raspadores tenham os atributos obrigatórios (territory_id, datas, etc) -- e ter uma O único contexto em que ter uma |
Atualizei aquela ferramenta, e as 219 Spiders com Seria problemático implementar a checagem e inferência das Outro problema é que ter considerar todas as diferentes maneiras de se referir a |
@Gab0, veja, o que eu entendo do que você está propondo é: ao invés de corrigir o problema, contornar ele. É isso que a ideia de inferência traz.
Não disse por qual motivo. Você diz que implementar meros Não vamos criar uma Então, você pode adicionar uma função |
O Scrapy utiliza a propriedade
allowed_domains
para impedir que o raspador seja direcionado para domínios não desejados ou potencialmente maliciosos. Ela é opcional, e precisa ser definida em cada raspador. Nesse projeto, acredito que seja válido que ela seja definida em todos os raspadores.A maior parte dos raspadores desse repositório declara
allowed_domains
manualmente e também declara alguma URL para direcionar o raspador. O problema é que em muitos casos, a propriedadeallowed_domains
é uma lista com um único domínio: o domínio da URL passada ao raspador, conforme mostrado no exemplo abaixo:Para evitar essa redundância, poderíamos empregar um método de gerar
allowed_domains
automaticamente, com base na URL fornecida. Isso simplificaria o código dos raspadores, permitindo omitir essa propriedade e garantindo que ela esteja sempre definida.Existem exceções: alguns raspadores precisam de mais de um
allowed_domains
, para buscar informações em outros lugares. Nesses casos, bastaria declarar a propriedade manualmente.Essa issue pode afetar mais de 100 raspadores neste repositório. Podemos discutir sobre a validade dessa issue, e se for considerada válida, proponho que seja resolvida em duas etapas:
BaseGazetteSpider.__init__
, checar a existência da propriedadeallowed_domains
na instância. Se não existir, utilizamos aurllib
para extrair o domínio encontrado em alguma propriedade conhecida como apontadoras da URL inicial. O nome dessa variável não é padronizado entre os raspadores: encontramosbase_url
,url_base
e até mesmoBASE_URL
. Se não forem encontrados meios de ter aallowed_domains
definida, podemos emitir um alerta.allowed_domains
de todos os raspadores.The text was updated successfully, but these errors were encountered: