这与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
?如果没有用户代理标头,查询是否应该工作?
答案 0 :(得分:2)
FG,
有些提供商不喜欢将数据提供给可能只是在抓取数据的自动化工具......他们“可以告诉”他们为“人”提供服务的方式之一,而不是某种糟糕的Python脚本通过检查浏览器通常应用的User-Agent标头。
在这个特定的例子中,Glassdoor发布了他们的API Terms here,并且从第3页开始,他们声明“我们保留限制或阻止对Glassdoor API进行大量调用的应用程序的权利。主要不是为了回应个别最终用户的直接行动。“
我倾向于认为通过查找Header:User-Agent来强制执行此操作,但大多数公司都不会明确说明他们如何强制执行此操作。他们还要求您在显示其数据的已批准网页/网站上显示其徽标并链接到其主页。
希望这有帮助。