Получить прикрепленный файл, используя запрос POST в python - PullRequest
0 голосов
/ 29 апреля 2020

Этот сайт содержит информацию о работниках c. Я заинтересован в получении, используя requests информацию year=2015 относительно Experiencia laboral для публикации c зависимость = ADMINISTRACION DEL PATRIMONIO DE LA BENEFICENCIA PUBLICA. Это можно выбрать из выпадающего меню.

Screen when the two parameters are selected

После нажатия на consultar información мы получаем следующую панель:

Final selection panel

Оттуда я могу нажать на номер 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, так что, очевидно, я что-то упускаю, поэтому любые рекомендации или советы будет очень ценится.

...