python-3.x 抓取CDC Wonder API的用户门户

mwg9r5ms  于 2023-01-27  发布在  Python
关注(0)|答案(1)|浏览(153)

事先为这本小说道歉,我试着把它提炼成一些简短而甜蜜的东西,但发现这是不可能的。我真的希望有人能在这个问题上提供一些线索。
该项目:构建一组实用程序,使CDC Wonder API的使用更加简单。
Wonder API有几个端点,例如/D140/D76
必须使用POST请求命中端点,并将一组查询参数作为POST数据参数作为xml字符串发送。
查询参数xml字符串比较复杂,基本格式为

<parameter>
<name></name>
<value></value>
</parameter>
</request-parameters>

通过访问面向用户的查询门户,可以更好地理解名称和值。每个输入(表单、复选框、单选按钮等)对应一个查询参数。每个参数名称都采用代码的形式,如D76.V9O_V27fmode。值也可以是代码,有时也可以是纯文本,如*All*
每个端点需要一组稍有不同的参数,值的编码也不同。CDC没有提供每个端点需要哪些参数的文档。他们的文档明确告诉您,查找此信息的最佳方法是检查面向用户的查询门户的源代码,其中每个元素都将其名称和值作为属性嵌入。
我发现,您还可以通过打开dev tools network选项卡、提交填写好的查询表单,并在新页面加载了您的结果之后,检查POST调用的头表单数据来检索这些参数。
我尝试构建的一个实用程序是抓取查询门户页面,并通过编程从HTML源代码中提取所有参数的名称和值。看起来很简单,我想我知道如何做到这一点。
但问题是:面向用户的查询门户的URL与您调用的端点的URL相同。在Web浏览器中,转到此URL(https://wonder.cdc.gov/controller/datarequest/D76)会将您带到您填写的查询表单。但是,当您在Python的请求中使用相同的URL时,它需要查询参数的xml字符串,否则您将得到错误。
是否可以使用requests库来访问此用户门户?我尝试将referer设置为https://wonder.cdc.gov/ucd-icd10.html,这是一个页面,您必须同意条款和条件才能访问查询门户。我还尝试将表单数据从network选项卡中提取出来,并将其作为xml字符串与POST请求一起发送。并得到了500的回复--它期待查询参数(包括一个同意使用条款的特定参数,如文档中所概述的)。

xml_string =  '''<query-parameters>
<parameter><name>stage</name> <value>about</value> </parameter> <parameter> <name>saved_id</name> <value></value> </parameter> <parameter> <name>action-I Agree</name> <value>I Agree</value> </parameter> </query-parameters> '''
data = {'request_xml': xml_string}
response = requests.post('https://wonder.cdc.gov/controller/datarequest/D76')
print(response.text) 
print(response)

真的很好奇知道如何破解这个坚果,我在这里错过了什么?我应该如何处理这个问题?

flseospp

flseospp1#

很长一段时间后,你问的问题,但我认为问题是与职位的要求,也是你的数据变量的内容。
还有一点需要注意的是,在xml_string中应该是“result-parameters”而不是“query-parameters”。
看起来文档确实有了很大的改进:https://github.com/alipphardt/cdc-wonder-api/blob/master/CDC%2BWONDER%2BAPI%2BExample.ipynb
我认为你可以这样解决这个问题:

xml_string = \
            '''<query-parameters>
                <parameter>
                    <name>stage</name> 
                    <value>about</value> 
                </parameter> 
                <parameter> 
                    <name>saved_id</name> 
                    <value></value> 
                </parameter>
            </query-parameters> '''

url = 'https://wonder.cdc.gov/controller/datarequest/D76' ## or D140
param_name = 'request_xml'

url = "https://wonder.cdc.gov/controller/datarequest/D76"
response = requests.post(url, data={"request_xml": xml_string, "accept_datause_restrictions": "true"})

相关问题