REST:Glassdoor API在标头中需要User-Agent

时间:2015-06-20 17:22:27

标签: python rest python-3.x python-requests

这与this问题有关。我试图使用记录的parameters查询Glassdoor公共API,但仍然获得403 Forbidden响应。为了确保正确使用查询参数来创建URL,我使用了编写的查询URL并在浏览器中尝试了它并且它有效。

从我的浏览器所做的查询向后工作,我设法弄清楚用户代理不仅需要是URL中的参数,还需要在标题中传递。

所以把这一切放在一起,这里是成功查询Glassdoor公共API的代码:

SELECT DISTINCT ?person
WHERE {
    ?person a dbpedia-owl:Person.
Optional{
    ?person dbpedia-owl:birthPlace ?country.
}
Optional{
    ?person dbpedia-owl:birthPlace ?place.
    ?place dbpedia-owl:country ?country
}
filter(?country= dbpedia:Portugal)
}

我的问题是 - 当import urllib.request as request import requests import json from collections import OrderedDict # authentication information & other request parameters params_gd = OrderedDict({ "v": "1", "format": "json", "t.p": "xxxxxx", "t.k": "yyyyyyyy", "action": "employers", "employerID": "11111", # programmatically get the IP of the machine "userip": json.loads(request.urlopen("http://ip.jsontest.com/").read().decode('utf-8'))['ip'], "useragent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36" }) # construct the URL from parameters basepath_gd = 'http://api.glassdoor.com/api/api.htm' # request the API response_gd = requests.get(basepath_gd, params=params_gd, headers={ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36" }) # check the response code (should be 200) & the content response_gd response_gd.content 已经是URL参数的一部分时,为什么需要在查询标题中指定User-Agent?如果没有用户代理标头,查询是否应该工作?

1 个答案:

答案 0 :(得分:2)

FG,

有些提供商不喜欢将数据提供给可能只是在抓取数据的自动化工具......他们“可以告诉”他们为“人”提供服务的方式之一,而不是某种糟糕的Python脚本通过检查浏览器通常应用的User-Agent标头。

在这个特定的例子中,Glassdoor发布了他们的API Terms here,并且从第3页开始,他们声明“我们保留限制或阻止对Glassdoor API进行大量调用的应用程序的权利。主要不是为了回应个别最终用户的直接行动。“

我倾向于认为通过查找Header:User-Agent来强制执行此操作,但大多数公司都不会明确说明他们如何强制执行此操作。他们还要求您在显示其数据的已批准网页/网站上显示其徽标并链接到其主页。

希望这有帮助。