-
-
Notifications
You must be signed in to change notification settings - Fork 416
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
Cria raspador base para DETO e municípios #1336
base: main
Are you sure you want to change the base?
Cria raspador base para DETO e municípios #1336
Conversation
Também conserta url removendo espaços e adiciona {"DOWNLOAD_DELAY": 1.0}
Preciso de uma ajuda pra decidir o que fazer com esta tarefa. Apesar do site ser bem difícil de raspar devido a sua dependência no JS, tava até me divertindo conseguindo tocar aos trancos e barrancos. O problema começou a surgir nesta navegação entre páginas. Comecei a receber respostas inesperadas do backend sem motivo aparente. Após muita dor de cabeça, cheguei à conclusão que o problema é no backend mesmo, e não parece ser um bug no meu raspador. O que acontece é que, em alguns momentos, uns itens são baixáveis porque o servidor responde OK na requisição necessária para construir o link de download do arquivo, em outros momentos, ele retorna um html de erro dizendo "dados inválidos" e não me dá o necessário para continuar. Outra evidência de mal comportamento do backend é o estado do código da página. É um terror, e mostra que ele foi feito com técnicas e tecnologias muito antigas e mal-mantidas. Se o frontend está assim, imagino que o backend siga o exemplo. Pra piorar, fui ver o site das outras cidades que deveriam ser cópias deste e logo na primeira (Combinado) percebi que o site parecia igual, mas com código levemente diferente. Outra cidade (Aurora do Tocantins), outro site semelhante, mas com código levemente diferente dos dois anteriores. Outras evidências disso são:
Isso indica que seria inviável(?) fazer um BaseSistema que funcione para todos porque cada site requer raspagem diferente. Nota: Além disso, me parece inviável prosseguir com a criação do raspador para Lavandeira também, porque não dá pra confiar que o servidor vai responser da mesma maneira dadas requisições iguais. Nota: |
Também cria métodos abstratos na base que jogam erro
Pessoal, atualizei o raspador base com tudo o que seria necessário para poder baixar todos o diários,
O problema da instabilidade foi resolvido mas o problema da resposta inválida ainda continua, só que agora ela é previsível. Agora, o raspador está falhando previsivelmente da seguinte forma: Caso mais de uma página seja requisitada, apenas os itens da última página serão baixados com sucesso. Logo, esse comportamento é evidente também no log de coleta.
Podem me dar uma luz sobre o que pode estar ocorrendo? Continuarei com o desenvolvimento do limitador e detecção de extras em paralelo enquanto vocês dão uma olhada. |
Acabei de testar o retry de requisições falhas (que retornam "Dados inválidos") e não tive sucesso. if "Dados inválidos" in response.text:
retry_request = response.request.copy()
retry_request.dont_filter = True
yield retry_request
return Isso resultaria num loop infinito caso entre na condição, e foi o que aconteceu. |
Teoria: Talvez os Removi os dois existentes, substituindo-os pelo conteúdo de O problema persiste. |
Seguindo a teoria de que algo no paralelismo seja a causa do problema, tentei também usar o setting Essa teoria surge do fato que testes da mesma lógica funcionam perfeitamente quando executado no scrapy shell. Executando os mesmos comandos do deto.py, um após outro no scrapy shell, resulta em nenhum dos itens falhando. Escrevi este código helper para copiar e colar no shell. import datetime
import re
import scrapy
from scrapy import FormRequest
from scrapy.selector import Selector
from gazette.items import Gazette
page_size = 10
total_pages_count = None
script_case_session = None
BASE_URL = "https://lavandeira.to.gov.br/transparencia"
data = {
"nmgp_parms": "nm_run_menu?#?1?@?nm_apl_menu?#?menu_diarioeletronico?@?script_case_init?#?1",
"script_case_init": "1",
"nm_apl_menu": "menu_diarioeletronico",
}
request = FormRequest(
url=f"{BASE_URL}/diarioeletronico_grid_cliente/",
formdata=data,
)
fetch(request)
######## parse_table
table_footer = response.xpath(
"(//table[contains(@class, 'scGridToolbar')]//span)[last()]/text()"
).get()
items_counter_search = re.search(r"(\d+?)\]$", table_footer)
total_pages_count = int(items_counter_search.group(1))
######## consume_table_items
lines = response.xpath('//tr[starts-with(@id, "SC_ancor")]').getall()
# line loop
line = lines[0]
modal_param_search = re.search(
r"(@SC_par@\d+?@SC_par@diarioeletronico_grid_cliente@SC_par@.+?)'",
line,
)
modal_params = modal_param_search.group(1)
date_str = (
Selector(text=line)
.xpath('//span[starts-with(@id, "id_sc_field_dataedicao_")]/text()')
.get()
)
doc_date = datetime.datetime.strptime(date_str, "%d/%m/%Y").date()
doc_edition = (
Selector(text=line)
.xpath('//span[starts-with(@id, "id_sc_field_numeroedicao_")]/text()')
.get()
)
item_params = {
"doc_date": doc_date,
"doc_edition": doc_edition,
}
modal_url = (
f"{BASE_URL}/diarioeletronico_form_cliente/?"
f"nmgp_outra_jan=true&"
f"nmgp_url_saida=modal&"
f"SC_lig_apl_orig=diarioeletronico_grid_cliente&"
f"nmgp_parms={modal_params}"
)
fetch(modal_url)
####### parse_modal_items
"Dados inválidos" in response.text
####### maybe_crawl_next_page
next_page_start = 11
data = {
"nmgp_opcao": "ajax_navigate",
"script_case_init": "1",
"opc": "rec",
"parm": str(next_page_start),
}
request = FormRequest(
url=f"{BASE_URL}/diarioeletronico_grid_cliente/",
formdata=data,
)
fetch(request)
####### parse table
html_text = None
for item in response.json()["setValue"]:
if item["field"] == "sc_grid_body":
html_text = item["value"]
response = Selector(text=html_text)
######## consume_table_items
lines = response.xpath('//tr[starts-with(@id, "SC_ancor")]').getall()
# line loop
line = lines[0]
modal_param_search = re.search(
r"(@SC_par@\d+?@SC_par@diarioeletronico_grid_cliente@SC_par@.+?)'",
line,
)
modal_params = modal_param_search.group(1)
date_str = (
Selector(text=line)
.xpath('//span[starts-with(@id, "id_sc_field_dataedicao_")]/text()')
.get()
)
doc_date = datetime.datetime.strptime(date_str, "%d/%m/%Y").date()
doc_edition = (
Selector(text=line)
.xpath('//span[starts-with(@id, "id_sc_field_numeroedicao_")]/text()')
.get()
)
item_params = {
"doc_date": doc_date,
"doc_edition": doc_edition,
}
modal_url = (
f"{BASE_URL}/diarioeletronico_form_cliente/?"
f"nmgp_outra_jan=true&"
f"nmgp_url_saida=modal&"
f"SC_lig_apl_orig=diarioeletronico_grid_cliente&"
f"nmgp_parms={modal_params}"
)
fetch(modal_url)
####### parse_modal_items
"Dados inválidos" in response.text |
Layout do site publicador de diários oficiais
Marque apenas um dos itens a seguir:
Código da(s) spider(s)
custom_settings
em meu raspador.Testes
.log
deste teste está anexado na PR..log
e.csv
deste teste estão anexados na PR..log
e.csv
deste teste estão anexados na PR.Verificações
.csv
gerados pela minha coleta conforme a documentação não encontrando problemas..log
gerados pela minha coleta conforme a documentação não encontrando problemas.Descrição
#1093
Esta PR tenta adicionar 7 raspadores de Tocantins que usariam o mesmo sistema de publicação.