【发布时间】:2018-08-03 22:34:33
【问题描述】:
我正在尝试使用媒体 ID 注册表的 API(EIDR)来下载电视节目信息。我希望能够自动查询许多节目。我在如何使用 API 方面没有经验,而且这个特定的 documentation 非常不透明。我在 Ubuntu 16.04 中使用 python 3(请求库)。
我尝试发送特定电视节目的请求。我从浏览器中获取了标头和参数信息,例如,我从浏览器中进行了查询(我查找了“anderson cooper 360”from this page),然后查看了浏览器页面的“网络”选项卡中的信息检查员。我使用了以下代码:
import requests
url = 'https://resolve.eidr.org/EIDR/query/'
headers = {'Host': 'ui.eidr.org', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) \
Gecko/20100101 Firefox/58.0', \
'Accept': '*/*', \
'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', \
'Referer': 'https://ui.eidr.org/search/results/19c70c63d73790b86f3fb385f2a9b3f4', \
'Cookie': 'ci_session=f4tnbi8qm7oaq30agjtn8p69j91s4li4; \
_ga=GA1.2.1738620664.1519337357; _gid=GA1.2.1368695940.1519337357; _gat=1', \
'Connection': 'keep-alive'}
params = {'search_page_size':25, 'CustomAsciiSearch[_v]':1, \
'search_type':'content', 'ResourceName[_v]':'anderson cooper 360', \
'AlternateResourceNameAddition[_v]':1, \
'AssociatedOrgAlternateNameAddition[_v]':1, 'Status[_v]':'valid'}
r = requests.post(url, data=params, headers=headers)
print(r.text)
我收到的回复基本上说这是一个无效请求:
<?xml version="1.0" encoding="UTF-8"?><Response \
xmlns="http://www.eidr.org/schema" version="2.1.0"><Status>\
<Code>3</Code><Type>invalid request</Type></Status></Response>
现在,我在this Stackoverflow question 的回答中读到我应该以某种方式使用会话对象。答案中建议的代码 Padraic Cunningham 是这样的:
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:46.0) \
Gecko/20100101 Firefox/46.0','X-Requested-With': 'XMLHttpRequest', \
"referer": "https://www.hackerearth.com/challenges/"}
with requests.Session() as s:
s.get("https://www.hackerearth.com")
headers["X-CSRFToken"] = s.cookies["csrftoken"]
r = s.post("https://www.hackerearth.com/AJAX/filter-challenges/?modern=true", \
headers=headers, files={'submit': (None, 'True')})
print(r.json())
所以我知道我应该以某种方式使用它,但我不完全理解为什么或如何。
所以我的问题是:
1) 在这种情况下,“无效请求”是什么意思?
2) 你对如何编写请求有什么建议吗?
3) 你知道我应该怎么做才能在此处正确使用会话对象吗?
谢谢!
【问题讨论】:
标签: python api session post python-requests