Как я могу использовать HTTP-запросы для получения данных с страницы.jsf?

Мне нужно получить данные программно с сайтов JSF.

Вот пример: https://dataminer.pjm.com/dataminerui/pages/public/lmp.jsf

Чтобы получить данные, введите дату начала и дату окончания и нажмите "Экспорт CSV" в верхнем правом углу. (Он генерирует достаточное количество данных, поэтому выбирайте 1-дневный диапазон.)

На вкладке "Сеть" в Chrome я вижу следующие заголовки запросов и данные формы:

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8,ko;q=0.6,zh;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:425
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=gixQBXBESRofyqLpiH2hlYg8; dataminer=1369707692.36895.0000; __utma=109610308.1662709339.1456530705.1456530705.1456530705.1; __utmc=109610308; __utmz=109610308.1456530705.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); JSESSIONID=8sx6CTIQhpPAAO5+4xcGGGlb; WT_FPC=id=xxx.xxx.xxx.xx-3069233008.30503152:lv=1456533141859:ss=1456530705581
Host:dataminer.pjm.com
Origin:https://dataminer.pjm.com
Referer:https://dataminer.pjm.com/dataminerui/pages/public/lmp.jsf
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36

Form Data
frmCriteria:frmCriteria
frmCriteria:calStartDate_input:01/01/2016
frmCriteria:calStopDate_input:01/02/2016
frmCriteria:mnuMarket_input:REALTIME
frmCriteria:mnuMarket_focus:
frmCriteria:mnuFreq_input:Daily
frmCriteria:mnuFreq_focus:
frmCriteria:mnuPnodes_input:All
frmCriteria:mnuPnodes_focus:
javax.faces.ViewState:8578362602192686517:-1021667131748875106
frmCriteria:j_idt78:frmCriteria:j_idt78

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

Я пробовал много способов восстановить этот заголовок и сформировать данные, но, похоже, не может произвести загрузку CSV.

Изменить: Я пробовал следующее. Я очень мало знаю о структуре HTTP-запросов и ответов и куки файлы, так что это может быть комически плохо. Я получаю 500 на POST.

import requests


headers = {
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
 'Accept-Encoding': 'gzip, deflate',
 'Accept-Language': 'en-US,en;q=0.8,ko;q=0.6,zh;q=0.4',
 'Cache-Control': 'max-age=0',
 'Connection': 'keep-alive',
 'Content-Length': 425,
 'Content-Type': 'application/x-www-form-urlencoded',
 'Host': 'dataminer.pjm.com',
 'Origin': 'https://dataminer.pjm.com',
 'Referer': 'https://dataminer.pjm.com/dataminerui/pages/public/lmp.jsf',
 'Upgrade-Insecure-Requests': 1,
 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
}


data = {
 'frmCriteria': 'frmCriteria',
 'frmCriteria': 'calStartDate_input:01/01/2016',
 'frmCriteria': 'calStopDate_input:01/02/2016',
 'frmCriteria': 'mnuMarket_input:REALTIME',
 'frmCriteria': 'mnuMarket_focus:',
 'frmCriteria': 'mnuFreq_input:Daily',
 'frmCriteria': 'mnuFreq_focus:',
 'frmCriteria': 'mnuPnodes_input:All',
 'frmCriteria': 'mnuPnodes_focus:',
 'javax.faces.ViewState': '8578362602192686517:-1021667131748875106',
 'frmCriteria:j_idt78': 'frmCriteria:j_idt78'
}


url = 'https://dataminer.pjm.com/dataminerui/pages/public/lmp.jsf'


with requests.Session() as s:
 get_response = s.get(url)
 post_response = s.post(url, headers=headers, data=data)

Как я могу использовать библиотеку запросов для извлечения CSV?

1 ответ

Вы, возможно, не сможете, если не пройдете все, что ведет к рассматриваемой странице. Страницы JSF, как правило, хранят много состояний в веб-сеансе, поэтому вы можете просто получать POST какую-то статическую полезную нагрузку (как вы делаете) и ожидать, что она будет работать.

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

Таким образом, вместо того, чтобы идти прямо к любому запросу, который вы пытаетесь сделать, вам, возможно, придется "ходить по страницам", который доставил вас туда.

Отслеживайте все запросы, необходимые для их получения, посмотрите, какие изменения происходят с шага на шаг и сеанс на сеанс, и посмотрите, можете ли вы выполнить минимальное количество шагов (в идеале всего 1 или 2), чтобы отключить его.

licensed under cc by-sa 3.0 with attribution.