Этот сайт содержит информацию о работниках c. Я заинтересован в получении, используя requests
информацию year=2015
относительно Experiencia laboral
для публикации c зависимость = ADMINISTRACION DEL PATRIMONIO DE LA BENEFICENCIA PUBLICA
. Это можно выбрать из выпадающего меню.
После нажатия на consultar información
мы получаем следующую панель:
Оттуда я могу нажать на номер 250
, принадлежащий числу результатов Experiencia Laboral
и, наконец, загрузить файл, подтвердив загрузку.
После изучения вызовов ajax с помощью devtools мне удалось пройти весь путь до подтверждения загрузки файла = zip = после выполнения вышеупомянутого кода со следующим кодом:
params = {
"form:catDepcia_input": "12950:ADMINISTRACION DEL PATRIMONIO DE LA BENEFICENCIA PUBLICA",
"form:aniosSelect_target": "2015",
"javax.faces.partial.ajax": "true",
"javax.faces.source": "form:idBusqArch",
"javax.faces.partial.execute": "form:idBusqArch form:catDepcia form:idDec form:aniosSelect form:IdlstBusq",
"javax.faces.partial.render": "form:idResBusq form:messages form:idPanelDetExistencias",
"form:idBusqArch": "form:idBusqArch"
}
params_2 = {
"javax.faces.partial.ajax": "true",
"javax.faces.source": "form:idButtonConfirmar",
"javax.faces.partial.execute": "form:idButtonConfirmar",
"javax.faces.partial.render": "form:idResBusq",
"form:idButtonConfirmar": "form:idButtonConfirmar"
}
params_3 = {
"javax.faces.partial.ajax": "true",
"javax.faces.source": "form:idDtgrid23:5:idLinkFile",
"javax.faces.partial.execute": "form:idDtgrid23:5:idLinkFile",
"javax.faces.partial.render": "form:idPanelEncZip",
"form:idDtgrid23:5:idLinkFile": "form:idDtgrid23:5:idLinkFile"
}
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Faces-Request": "partial/ajax"
}
url = "http://www.servidorespublicos.gob.mx/registro/datosAbiertos.jsf"
with requests.Session() as s:
init = s.get(url)
soup = BeautifulSoup(init.text, "lxml")
val = soup.find("input", {"id": "j_id1:javax.faces.ViewState:0"})['value']
params["javax.faces.ViewState"] = val
params_2["javax.faces.ViewState"] = val
params_3["javax.faces.ViewState"] = val
r1 = s.post(url, data=params, headers=head)
r2 = s.post(url, data=params_2, headers=head)
r3 = s.post(url, data=params_3, headers=head)
print(r3.content)
Когда я нажимаю при подтверждении загрузки я вижу последний POST-запрос с другим заголовком. Но когда я пытаюсь сделать это с моим кодом, я не получаю прикрепленный zip-файл. Чтобы сделать это, я добавляю следующее к предыдущему коду:
head_2 = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36",
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
'Content-Disposition': 'attachment;filename="datosAbiertos.zip"',
"Content-Type": "application/zip",
"Set-Cookie": "primefaces.download=true"
}
params_4 = {
"form:catDepcia_input": "12950:ADMINISTRACION DEL PATRIMONIO DE LA BENEFICENCIA PUBLICA",
"form:aniosSelect_target": "2015",
"form:idButtonConfirmarZip": "",
"form:IdlstBusq_filter": "",
"form:nombreBusq1": ""
}
with requests.Session() as s:
init = s.get(url)
soup = BeautifulSoup(init.text, "lxml")
val = soup.find("input", {"id": "j_id1:javax.faces.ViewState:0"})['value']
params["javax.faces.ViewState"] = val
params_2["javax.faces.ViewState"] = val
params_3["javax.faces.ViewState"] = val
params_4["javax.faces.ViewState"] = val
r1 = s.post(url, data=params, headers=head)
r2 = s.post(url, data=params_2, headers=head)
r3 = s.post(url, data=params_3, headers=head)
r4 = s.post(url, data=params_4, headers=head_2)
print(r4.header['content-type'])
Что дает
text/html;charset=UTF-8
Вместо application/zip
, так что, очевидно, я что-то упускаю, поэтому любые рекомендации или советы будет очень ценится.