2016-02-27 85 views
0

我需要从JSF网站以编程方式获取数据。如何使用HTTP请求从.jsf页面获取数据?

下面是一个例子: https://dataminer.pjm.com/dataminerui/pages/public/lmp.jsf

获取数据,输入任意开始日期和结束日期,然后点击导出CSV在右上角。 (它产生的数据的相当数量,所以挑选1天的范围内。)

在铬的网络选项卡,我看到下面的请求头和形式的数据:

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 

我看到所有我的在这个请求中形成数据。似乎我应该能够通过提交正确的请求(使用Python的请求库)以编程方式下载此CSV。

我试过很多方法来重新生成这个头和表单数据,但似乎无法产生CSV下载。

编辑:我试过以下。我对HTTP请求和响应以及Cookie的结构知之甚少,所以这可能会非常糟糕。我在POST上得到500。

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?

+0

@KlausD。刚添加我的代码。这是一个非常简单的尝试。 – capitalistcuttle

+0

重复回答技术问题(只维护HTTP会话,不硬编码ID和'ViewState',它们不能跨请求/会话重用)。至于功能要求,如果没有可用于您要完成的任务的Web服务API,则最好询问网站所有者/管理员。一个体面的Java EE网站在用于HTML前端的JSF旁边,还有用于REST前端的JAX-RS。 – BalusC

回答

0

除非您浏览所有涉及该页面的内容,否则您可能无法完成此操作。 JSF页面倾向于在Web会话中存储很多状态,因此您可以简单地发布一些静态负载(就像您正在做的那样)并期望它能够正常工作。

一个完美的例子就是ViewState参数。该值可能每次都会改变,因此您使用的值可能完全无效。

因此,您可能不必直接接受任何您想要做的请求,您可能不得不“走过那些让您在那里”的页面。

跟踪所有到达那里的请求,查看从一步到另一步以及会话到会话的变化,看看你是否可以计算出最少的步数(理想情况下只有1或2) 。

+0

谢谢,我会尝试。尽管如此,我是如何反向设计标题和表单数据的呢?特别是像'frmCriteria:j_idt78':'frmCriteria:j_idt78,其中字段名称中有冒号。' – capitalistcuttle