在R中调用REST API

4

我最近发现了dataforseo API,并尝试通过R进行调用。

library(httr)

username <- 'mygmailadress@gmail.com'
password <- 'mypassword'

dataforseo_api <- POST('https://api.dataforseo.com/v2/op_tasks_post/$data', 
                authenticate(username,password), 
                body = list(grant_type = 'client_credentials'),
                type = "basic",
                verbose()
               )

我收到的信息如下:

<- HTTP/1.1 401 Unauthorized
<- Server: nginx/1.14.0 (Ubuntu)
<- Date: Sun, 08 Jul 2018 13:31:34 GMT
<- Content-Type: application/json
<- Transfer-Encoding: chunked
<- Connection: keep-alive
<- WWW-Authenticate: Basic realm="Rest Server"
<- Cache-Control: no-cache, must-revalidate
<- Expires: 0
<- Access-Control-Allow-Origin: *
<- Access-Control-Allow-Methods: POST, GET, OPTIONS
<- Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With

你知道我的问题可能出在哪里吗?能帮我一下吗?

1个回答

3
看起来您没有正确配置config。我在您的代码中没有看到config=。此外,body的编码也不正确。
另外,在API文档中,我没有看到关于grant_type的任何信息。看起来那里应该放置一组任务,例如:
   {882394209:  {'site': 'ranksonic.com', 'crawl_max_pages': 10}}

回复:

{'results_count': 1, 'results_time': '0.0629 sec.', 'results': {'2308949': {'post_id': 2308949, 'post_site': 'ranksonic.com',
 'task_id': 882394209, 'status': 'ok'}}, 'status': 'ok'}

好的,首先我们需要使用 set_configconfig=

username <- 'Hack-R@stackoverflow.com' # fake email
password <- 'vxnyM9s7FAKESeIO' # fake password

set_config(authenticate(username,password), override = TRUE)

GET("https://api.dataforseo.com/v2/cmn_se")
Response [https://api.dataforseo.com/v2/cmn_se]
  Date: 2018-07-08 16:20
  Status: 200
  Content-Type: application/json
  Size: 551 kB
{
    "status": "ok",
    "results_time": "0.0564 sec.",
    "results_count": 2187,
    "results": [
        {
            "se_id": 37,
            "se_name": "google.com.af",
            "se_country_iso_code": "AF",
            "se_country_name": "Afghanistan",
...
GET("https://api.dataforseo.com/v2/cmn_se/$country_iso_code")
Response [https://api.dataforseo.com/v2/cmn_se/$country_iso_code]
  Date: 2018-07-08 15:48
  Status: 200
  Content-Type: application/json
  Size: 100 B
{
    "status": "ok",
    "results_time": "0.0375 sec.",
    "results_count": 0,
    "results": []
GET("https://api.dataforseo.com/v2/cmn_se/$op_tasks_post")
Response [https://api.dataforseo.com/v2/cmn_se/$op_tasks_post]
  Date: 2018-07-08 16:10
  Status: 200
  Content-Type: application/json
  Size: 100 B
{
    "status": "ok",
    "results_time": "0.0475 sec.",
    "results_count": 0,
    "results": []
那是其中一个问题。此外,为了POST数据,他们需要您将其指定为json,例如:encode =“json”。来自他们的文档:

所有POST数据应以JSON格式(UTF-8编码)发送。通过POST方法传递任务数组来发送关键字。应在此POST数组的数据字段中指定数据。我们建议一次发送多达100个任务。

进一步地:

当任务数组发送到数据字段时,使用POST方法进行任务设置。每个数组元素具有以下结构:

然后列出2个必填字段和许多可选字段。
还要注意的是,可以在之后使用 reset_config() 作为更好的实践。如果您将经常运行此脚本、共享它或者使用多台计算机,我建议您将凭据放入环境变量中,而不是放入脚本中,以提高安全性和便利性。
另一个最后的建议是,您可能希望利用他们发布的 Python 客户端库和大量示例。由于每个新的 API 请求都是你在 R 中首创而没有他们的支持,因此仅仅在 Python 中进行数据收集可能会更加划算。
这是一个有趣的 API。如果您前往开放数据Stack Exchange,应该考虑与该社区分享它。

@Remi 很高兴能帮忙 :) - Hack-R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接