这与this问题有关。我试图使用记录的parameters查询Glassdoor公共API,但一直收到403 Forbidden响应。为了确保使用查询参数正确地创建URL,我使用了组合查询URL并在浏览器中对其进行了尝试,然后它可以工作。
从浏览器进行的查询中回溯,我设法弄清楚用户代理不仅需要作为URL中的参数,而且还需要在标头中传递。
因此,将所有这些放在一起,下面的代码将成功查询Glassdoor公共API:
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
我的问题是-为什么
User-Agent
已经是URL参数的一部分,为什么需要在查询头中指定?没有用户代理标头的查询是否不起作用? 最佳答案
fg,
一些提供者不喜欢将数据提供给可能只是在抓取数据的自动化工具...他们“可以告诉”他们正在提供“人员”而不是某种古怪的Python脚本的方式之一是通过检查通常由浏览器应用的User-Agent标头。
在这种特定情况下,Glassdoor已发布了他们的API Terms here,并从第三页的顶部声明:“我们保留限制或阻止对Glassdoor API进行大量调用的应用程序的权利,而这些调用并非主要是为了响应最终用户的直接行动。”
我倾向于认为这是通过查找Header:User-Agent来强制执行的,但是大多数公司不会明确说明他们如何强制执行此操作。他们还要求您显示其徽标,并链接到批准的用于显示其数据的网页/站点上的主页。
希望这可以帮助。