从JavaScript API调用访问数据

发布于 2025-02-06 04:50:51 字数 1455 浏览 2 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸠书 2025-02-13 04:50:51

我不知道您用来发送请求
但是,当我使用模块请求时,问题在查询中使+在查询中。

请求+转换为%2B,但服务器需要+

它需要使用urllib.parse使用safe> safe =“+”

data = {
    "xmlquery": "<post>\n<param+name=\"Exchange\"+value=\"NMF\"/>\n<param+name=\"SubSystem\"+value=\"Prices\"/>\n<param+name=\"Action\"+value=\"GetMarket\"/>\n<param+name=\"inst__a\"+value=\"0,1,2,5,21,23\"/>\n<param+name=\"ext_xslt\"+value=\"/nordicV3/paging_inst_table.xsl\"/>\n<param+name=\"Market\"+value=\"GITS:CO:CPHCB,GITS:CO:CPHBB,M:GITS:CO:CPHTA,GITS:CO:CPHAU,GITS:CO:CPHSA\"/>\n<param+name=\"RecursiveMarketElement\"+value=\"True\"/>\n<param+name=\"XPath\"+value=\"//inst[@itid='2'+or+@itid='3']\"/>\n<param+name=\"ext_xslt_lang\"+value=\"en\"/>\n<param+name=\"ext_xslt_tableId\"+value=\"bondsSearchDKTable\"/>\n<param+name=\"ext_xslt_options\"+value=\",noflag,\"/>\n<param+name=\"ext_xslt_hiddenattrs\"+value=\",fnm,isrid,dlt,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt,\"/>\n<param+name=\"ext_xslt_notlabel\"+value=\",fnm\"/>\n<param+name=\"ext_xslt_jspcbk\"+value=\"doPaging\"/>\n<param+name=\"ext_xslt_jsscbk\"+value=\"doSortPager\"/>\n<param+name=\"ext_xslt_sorder\"+value=\"descending\"/>\n<param+name=\"ext_xslt_sattr\"+value=\"chp\"/>\n<param+name=\"ext_xslt_start\"+value=\"0\"/>\n<param+name=\"ext_xslt_size\"+value=\"100\"/>\n<param+name=\"inst__an\"+value=\"id,nm,fnm,isin,cpnrt,bp,ap,lsp,chp,atap,ed,dlt,cr,isrid,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt\"/>\n<param+name=\"app\"+value=\"/obligationer/danmark\"/>\n</post>"
}

data_str = urllib.parse.urlencode(data, safe="+")

完整的工作代码:

在代码中您可以看到所有需要访问服务器的标头。

import requests
import urllib.parse

data = {
    "xmlquery": "<post>\n<param+name=\"Exchange\"+value=\"NMF\"/>\n<param+name=\"SubSystem\"+value=\"Prices\"/>\n<param+name=\"Action\"+value=\"GetMarket\"/>\n<param+name=\"inst__a\"+value=\"0,1,2,5,21,23\"/>\n<param+name=\"ext_xslt\"+value=\"/nordicV3/paging_inst_table.xsl\"/>\n<param+name=\"Market\"+value=\"GITS:CO:CPHCB,GITS:CO:CPHBB,M:GITS:CO:CPHTA,GITS:CO:CPHAU,GITS:CO:CPHSA\"/>\n<param+name=\"RecursiveMarketElement\"+value=\"True\"/>\n<param+name=\"XPath\"+value=\"//inst[@itid='2'+or+@itid='3']\"/>\n<param+name=\"ext_xslt_lang\"+value=\"en\"/>\n<param+name=\"ext_xslt_tableId\"+value=\"bondsSearchDKTable\"/>\n<param+name=\"ext_xslt_options\"+value=\",noflag,\"/>\n<param+name=\"ext_xslt_hiddenattrs\"+value=\",fnm,isrid,dlt,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt,\"/>\n<param+name=\"ext_xslt_notlabel\"+value=\",fnm\"/>\n<param+name=\"ext_xslt_jspcbk\"+value=\"doPaging\"/>\n<param+name=\"ext_xslt_jsscbk\"+value=\"doSortPager\"/>\n<param+name=\"ext_xslt_sorder\"+value=\"descending\"/>\n<param+name=\"ext_xslt_sattr\"+value=\"chp\"/>\n<param+name=\"ext_xslt_start\"+value=\"0\"/>\n<param+name=\"ext_xslt_size\"+value=\"100\"/>\n<param+name=\"inst__an\"+value=\"id,nm,fnm,isin,cpnrt,bp,ap,lsp,chp,atap,ed,dlt,cr,isrid,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt\"/>\n<param+name=\"app\"+value=\"/obligationer/danmark\"/>\n</post>"
}

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0', 
    'X-Requested-With': 'XMLHttpRequest',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',    
}

url = 'http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx'

data_str = urllib.parse.urlencode(data, safe="+")

response = requests.post(url, data=data_str, headers=headers)

#print(response.text)

import pandas as pd

all_tables = pd.read_html(response.text)
df = all_tables[1]

print(df)

我如何找到+

Python代码正在给出“错误获取基本数据:错误解析XMLSQUERY” - 因此,问题在XMLSQUERY中。

我使用devtool(tab:network)从浏览器中的请求中复制了xmlsquery,
并将(Char-by-char)与response.request.body从Python代码进行了比较。

correct = "xmlquery=...from browser..."
wrong   = response.request.body

for char_a, char_b in zip(correct, wrong):
    if char_a != char_b:
       print(char_a, char_b)

I have no idea what you used to send request
but when I use module requests then problem makes + in query.

requests converts + to %2B but server needs +.

It needs to manually convert data using urllib.parse with safe="+"

data = {
    "xmlquery": "<post>\n<param+name=\"Exchange\"+value=\"NMF\"/>\n<param+name=\"SubSystem\"+value=\"Prices\"/>\n<param+name=\"Action\"+value=\"GetMarket\"/>\n<param+name=\"inst__a\"+value=\"0,1,2,5,21,23\"/>\n<param+name=\"ext_xslt\"+value=\"/nordicV3/paging_inst_table.xsl\"/>\n<param+name=\"Market\"+value=\"GITS:CO:CPHCB,GITS:CO:CPHBB,M:GITS:CO:CPHTA,GITS:CO:CPHAU,GITS:CO:CPHSA\"/>\n<param+name=\"RecursiveMarketElement\"+value=\"True\"/>\n<param+name=\"XPath\"+value=\"//inst[@itid='2'+or+@itid='3']\"/>\n<param+name=\"ext_xslt_lang\"+value=\"en\"/>\n<param+name=\"ext_xslt_tableId\"+value=\"bondsSearchDKTable\"/>\n<param+name=\"ext_xslt_options\"+value=\",noflag,\"/>\n<param+name=\"ext_xslt_hiddenattrs\"+value=\",fnm,isrid,dlt,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt,\"/>\n<param+name=\"ext_xslt_notlabel\"+value=\",fnm\"/>\n<param+name=\"ext_xslt_jspcbk\"+value=\"doPaging\"/>\n<param+name=\"ext_xslt_jsscbk\"+value=\"doSortPager\"/>\n<param+name=\"ext_xslt_sorder\"+value=\"descending\"/>\n<param+name=\"ext_xslt_sattr\"+value=\"chp\"/>\n<param+name=\"ext_xslt_start\"+value=\"0\"/>\n<param+name=\"ext_xslt_size\"+value=\"100\"/>\n<param+name=\"inst__an\"+value=\"id,nm,fnm,isin,cpnrt,bp,ap,lsp,chp,atap,ed,dlt,cr,isrid,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt\"/>\n<param+name=\"app\"+value=\"/obligationer/danmark\"/>\n</post>"
}

data_str = urllib.parse.urlencode(data, safe="+")

Full working code:

In code you can see all needed headers to access server.

import requests
import urllib.parse

data = {
    "xmlquery": "<post>\n<param+name=\"Exchange\"+value=\"NMF\"/>\n<param+name=\"SubSystem\"+value=\"Prices\"/>\n<param+name=\"Action\"+value=\"GetMarket\"/>\n<param+name=\"inst__a\"+value=\"0,1,2,5,21,23\"/>\n<param+name=\"ext_xslt\"+value=\"/nordicV3/paging_inst_table.xsl\"/>\n<param+name=\"Market\"+value=\"GITS:CO:CPHCB,GITS:CO:CPHBB,M:GITS:CO:CPHTA,GITS:CO:CPHAU,GITS:CO:CPHSA\"/>\n<param+name=\"RecursiveMarketElement\"+value=\"True\"/>\n<param+name=\"XPath\"+value=\"//inst[@itid='2'+or+@itid='3']\"/>\n<param+name=\"ext_xslt_lang\"+value=\"en\"/>\n<param+name=\"ext_xslt_tableId\"+value=\"bondsSearchDKTable\"/>\n<param+name=\"ext_xslt_options\"+value=\",noflag,\"/>\n<param+name=\"ext_xslt_hiddenattrs\"+value=\",fnm,isrid,dlt,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt,\"/>\n<param+name=\"ext_xslt_notlabel\"+value=\",fnm\"/>\n<param+name=\"ext_xslt_jspcbk\"+value=\"doPaging\"/>\n<param+name=\"ext_xslt_jsscbk\"+value=\"doSortPager\"/>\n<param+name=\"ext_xslt_sorder\"+value=\"descending\"/>\n<param+name=\"ext_xslt_sattr\"+value=\"chp\"/>\n<param+name=\"ext_xslt_start\"+value=\"0\"/>\n<param+name=\"ext_xslt_size\"+value=\"100\"/>\n<param+name=\"inst__an\"+value=\"id,nm,fnm,isin,cpnrt,bp,ap,lsp,chp,atap,ed,dlt,cr,isrid,tp,bb,ib,cpt,rps,os,lt,st,itid,lists,it,mkt\"/>\n<param+name=\"app\"+value=\"/obligationer/danmark\"/>\n</post>"
}

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0', 
    'X-Requested-With': 'XMLHttpRequest',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',    
}

url = 'http://www.nasdaqomxnordic.com/webproxy/DataFeedProxy.aspx'

data_str = urllib.parse.urlencode(data, safe="+")

response = requests.post(url, data=data_str, headers=headers)

#print(response.text)

import pandas as pd

all_tables = pd.read_html(response.text)
df = all_tables[1]

print(df)

How I found +:

Python code was giving "Error getting base data: Error parsing xmlsquery" - so problem was in xmlsquery.

I copied working xmlsquery from request in browser using DevTool (tab: Network) in Chrome/Firefox
and compared (char-by-char) with response.request.body from Python code.

correct = "xmlquery=...from browser..."
wrong   = response.request.body

for char_a, char_b in zip(correct, wrong):
    if char_a != char_b:
       print(char_a, char_b)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文