【问题标题】:REST: Glassdoor API requires User-Agent in headerREST:Glassdoor API 在标头中需要 User-Agent
【发布时间】:2015-06-20 17:22:27
【问题描述】:

这与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 参数的一部分时,为什么还需要在查询标头中指定它?如果没有用户代理标头,查询不应该工作吗?

【问题讨论】:

  • HTTP 标头与 API 提供者可能需要的 useragent 标头无关。在这种情况下,似乎标头应该是 your 代理,而 useragent 参数应该是最终用户的代理。
  • @poke 我必须承认我对你的答案并不完全清楚,这可能是因为我对 REST 的理解不够好。您可以指出的任何参考资料将帮助我了解两者可能不同的部署场景?
  • @fgnu 很好的解决方案!这比 Glassdoor 官方文档效果更好。您能否详细说明您是如何“从浏览器进行的查询向后工作”的?

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


【解决方案1】:

fg,

一些提供商不喜欢将数据提供给可能只是在抓取数据的自动化工具……这是他们“可以判断”他们正在为“人”而不是某种古怪的 Python 脚本服务的一种方式是通过检查浏览器通常应用的 User-Agent 标头。

在这个特定的例子中,Glassdoor 发布了他们的API Terms here,并在第三页顶部声明“我们保留限制或阻止对 Glassdoor API 进行大量调用的应用程序的权利响应个别最终用户的直接行为。”

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

希望这会有所帮助。

【讨论】:

  • 但这肯定不是障碍吗?
  • 如上所示,通过应用虚假标头可以减轻障碍。
  • 确实,这就是我的意思,它根本没有障碍,很容易得到缓解。这就是为什么我不愿意接受您提供的理由作为 API 设计选择的原因。
  • 接受与否,这是你的选择。事实仍然存在,一些提供商检查 User-Agent 的原因是为了确保他们的数据的消费者是一个人,他以人的速度消费数据,而不是一个脚本,它没有人为限制的缓慢和其他- 要做的事情。
  • 这没有帮助。你只是重复了你的论点,没有额外的证据,声称这是一个“事实”。我的问题是为什么要设计一个带有这个障碍的 API,其明确目的是让脚本更难访问 API,而脚本可以很容易地绕过它。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多