Как получить данные JSON на этом сайте в Python 3? - PullRequest
1 голос
/ 05 апреля 2019

Моя работа в основном:

-Вход на этот сайт "https://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/preenchimento_municipio_cras_new1.php"

-Заполните 2 формы (например, AC - Acre и Bujari)

- Нажмите «Dados Detalhados» (подробные данные) в последнем столбце сгенерированной таблицы. (Когда вы нажимаете «Dados Detalhados», он генерирует вторую таблицу с данными по 1 месяцу на строку).

-Доступ к данным, сгенерированным второй таблицей, нажав «Visualizar Relatório» в последнем столбце каждой строки. <---- ЭТО данные, которые я пытаюсь очистить. Но это динамический веб-сайт, и я не могу получить данные, просто получая доступ к <code>url2 (когда вы нажимаете «Visualizar relatório», веб-сайт возвращается к исходному URL, но с таблицами, которые я хочу очистить). Вот код:

import requests
from bs4 import BeautifulSoup  
import pandas as pd

url = 'http://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/preenchimento_municipio_cras_new1.php'
params ={
    'uf_ibge': '12',
    'nome_estado': 'AC - Acre'
    'p_ibge': '1200138'
    'nome_municipio': 'Bujari'    
}


r = requests.post(url, params = params, verify = False)
soup = BeautifulSoup(r.text, "lxml")
tables = pd.read_html(r.text)
unidades = tables[1]
print(unidades)


url2 = 'http://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/rel_preenchidos_cras.php?&p_id_cras=12001301971'
params2 ={
    'p_id_cras': '12001301971'
    'mes_referencia': '2019-02-01'
}
r2 = requests.post(url2, json = params2, verify = False)
soup2 = BeautifulSoup(r2.text, 'lxml')

soup2

Обратите внимание, что url2 - это URL-адрес, сгенерированный при нажатии на кнопку "Dados Detalhados", и в качестве второго словаря у него есть p_id_cras.

params2 должно быть диктовкой, используемой для очистки данных, о которых я говорю. Я пробовал команды params, data и json во втором пост-запросе, но ни одна из них не работает.

1 Ответ

1 голос
/ 05 апреля 2019

url2 следует использовать GET без параметров.
И тогда у вас есть страница с таблицей со ссылками, которые имеют href="javascript:"
, но также onclick='enviadados(12001301971,"2019-02-01")'
, поэтому у вас есть параметры для следующего запроса,

В последнем запросе используется POST с параметрами 12001301971,2019-02-01 и URL

https://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/visualiza_preenchimento_cras.php'`

Мой код.Я надеюсь, что это работает правильно.

import requests
from bs4 import BeautifulSoup  
import pandas as pd

base = 'http://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/'

url = base + 'preenchimento_municipio_cras_new1.php'
#print('url:', url)
params ={
    'uf_ibge': '12',
    'nome_estado': 'AC - Acre',
    'p_ibge': '1200138',
    'nome_municipio': 'Bujari'    ,
}


r = requests.post(url, params=params, verify=False)
soup1 = BeautifulSoup(r.text, "lxml")
tables = pd.read_html(r.text)

#unidades = tables[1]
#print(unidades)

all_td1 = soup1.find('table', class_="panel-body").find_all('td')
#print('len(all_td1):', len(all_td1))
for td1 in all_td1:

    all_a1 = td1.find_all('a')[:1]
    #print('len(all_a1):', len(all_a1))
    for a1 in all_a1:

        url = base + a1['href']
        print('url:', url)

        r = requests.get(url, verify=False)
        soup2 = BeautifulSoup(r.text, "lxml")
        #print(soup.text)

        all_td2 = soup2.find('table', class_="panel-body").find_all('td')
        #print('len(all_td2):', len(all_td2))
        for td2 in all_td2:
            all_a2 = td2.find_all('a')
            #print('len(all_a2):', len(all_a2))
            for a2 in all_a2:
                print('onclick:', a2['onclick'])

                params = {
                    'p_id_cras': a2['onclick'][11:22], #'12001301971',
                    'mes_referencia': a2['onclick'][24:-2], #'2019-02-01',
                }

                print(params)

                url = 'https://aplicacoes.mds.gov.br/sagirmps/estrutura_fisica/visualiza_preenchimento_cras.php'
                r = requests.post(url, params=params, verify=False)
                soup = BeautifulSoup(r.text, "lxml")
                all_table = soup.find_all('table')
                print(all_table)
...