Отправить форму с использованием пакета запросов

#python #python-3.x #python-requests

#python #python-3.x #python-запросы

Вопрос:

Я знаю, что в SO есть много похожих вопросов, но я перепробовал все комбинации get , post , data , params , и т.д. в requests пакете, и я не могу получить форму для отправки. Я либо получаю обратно пустую строку, либо ту же страницу (т. Е. Не ту страницу, которую я ожидаю получить после нажатия кнопки Отправки)

 import requests
webserver = 'http://stev.oapd.inaf.it/cgi-bin/cmd'

# Returns the landing site
r = requests.get(webserver, data={'submit_form': 'Submit'}).text
# Returns an empty string
r = requests.get(webserver, params={'submit_form': 'Submit'}).text
# Returns an empty string
r = requests.post(webserver, data={'submit_form': 'Submit'}).text
# Returns the landing site
r = requests.post(webserver, params={'submit_form': 'Submit'}).text
  

Сайт недавно изменился, и я помню, что одна из этих команд определенно работала. Почему ни один из них не работает сейчас?

Комментарии:

1. Добавили ли вы другие требуемые значения формы на странице в параметры, отправленные с запросом?

2. Предполагается, что форма должна работать как есть, то есть в нее уже загружены параметры по умолчанию. Я попытался добавить дополнительные параметры, но это не внесло никаких изменений.

3. Значения по умолчанию указаны только в браузере. Фактический запрос по-прежнему должен иметь все требуемые значения. Убедитесь, что все значения формы отправляются как параметры.

Ответ №1:

Как вы упомянули, веб-сайт недавно изменился. Похоже, что теперь он использует form-data для получения запросов POST, а также требует отправки значений по умолчанию.

В целом, ваш код должен выглядеть следующим образом:

 import requests

webserver = 'http://stev.oapd.inaf.it/cgi-bin/cmd'

headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept": "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5"}

files = {
    'submit_form': (None,"Submit"),
    'cmd_version': (None,"3.2"),
    'track_parse': (None,"parsec_CAF09_v1.2S"),
    'track_colibri': (None,"parsec_CAF09_v1.2S_S35"),
    'track_postagb': (None,"no"),
    "n_inTPC": (None,"10"),
    "eta_reimers": (None,"0.2"),
    "kind_interp": (None,"1"),
    "kind_postagb": (None,"-1"),
    "photsys_file": (None,"tab_mag_odfnew/tab_mag_ubvrijhk.dat"),
    "photsys_version": (None,"YBC"),
    "dust_sourceM": (None,"dpmod60alox40"),
    "dust_sourceC": (None,"AMCSIC15"),
    "kind_mag": (None,"2"),
    "kind_dust": (None,"0"),
    "extinction_av": (None,"0.0"),
    "extinction_coeff": (None,"constant"),
    "extinction_curve": (None,"cardelli"),
    "imf_file": (None,"tab_imf/imf_kroupa_orig.dat"),
    "isoc_isagelog": (None,"0"),
    "isoc_agelow": (None,"1.0e9"),
    "isoc_ageupp": (None,"1.0e10"),
    "isoc_dage": (None,"0.0"),
    "isoc_lagelow": (None,"6.6"),
    "isoc_lageupp": (None,"10.13"),
    "isoc_dlage": (None,"0.0"),
    "isoc_ismetlog": (None,"0"),
    "isoc_zlow": (None,"0.0152"),
    "isoc_zupp": (None,"0.03"),
    "isoc_dz": (None,"0.0"),
    "isoc_metlow": (None,"-2"),
    "isoc_metupp": (None,"0.3"),
    "isoc_dmet": (None,"0.0"),
    "output_kind": (None,"0"),
    "output_kind": (None,"0"),
    "output_evstage": (None,"1"),
    "lf_maginf": (None,"-15"),
    "lf_magsup": (None,"20"),
    "lf_deltamag": (None,"0.5"),
    "sim_mtot": (None,"1.0e4"),
    ".cgifields": (None,"track_parsec"),
    ".cgifields": (None,"extinction_coeff"),
    ".cgifields": (None,"dust_sourceC"),
    ".cgifields": (None,"output_kind"),
    ".cgifields": (None,"extinction_curve"),
    ".cgifields": (None,"dust_sourceM"),
    ".cgifields": (None,"isoc_ismetlog"),
    ".cgifields": (None,"output_gzip"),
    ".cgifields": (None,"photsys_version"),
    ".cgifields": (None,"track_colibri"),   
    }

r = requests.post(webserver, headers=headers, files = files)
  

Надеюсь, это поможет!

Комментарии:

1. Спасибо, Fozoro, это сработало (хотя headers и не требуется, и в словаре есть некоторые незначительные ошибки, такие как photsys_version дублированный элемент)

2. Я поместил заголовок на всякий случай. Упс, спасибо, что указали на это, просто отредактировали мой ответ.