为什么我在连接到有效的网址时收到 403 错误

问题描述 投票:0回答:1

我正在尝试从 SEC 政府网站上获取一家公司的季度结束日期。由于某种原因,我不断收到连接错误。该代码适用于我在美国的朋友,但不适用于加拿大的我。我尝试使用 VPN,但仍然遇到相同的错误。这是代码和我收到的错误。

当我将网址输入 google 时,它会将我带到包含所有信息的页面,所以我不确定为什么不能将其拉入 R。

library(derivmkts)
library(quantmod)
library(jsonlite)
library(tidyverse)

url = "https://data.sec.gov/submissions/CIK0000320193.json"
df <- fromJSON(url, flatten = T)

Error in open.connection(con, "rb") : 
  cannot open the connection to 'https://data.sec.gov/submissions/CIK0000320193.json'
In addition: Warning message:
In open.connection(con, "rb") :
  cannot open URL 'https://data.sec.gov/submissions/CIK0000320193.json': HTTP status was '403 Forbidden'

连接到此网址时我没想到会出现 403 错误

r get httr jsonlite
1个回答
0
投票

他们要求您在请求标头中声明用户代理 - https://www.sec.gov/os/accessing-edgar-data

显然,作为示例提供的也可以接受,但您确实应该在那里提供您的联系方式。

使用

httr2
,它仍然使用
jsonlite
来解析 JSON 响应:

library(httr2)

resp <- request("https://data.sec.gov/submissions/CIK0000320193.json") |>
  req_user_agent("Sample Company Name AdminContact@<sample company domain>.com") |>
  # set verbosity level for debugging, 1: show headers
  req_perform(verbosity = 1)
#> -> GET /submissions/CIK0000320193.json HTTP/1.1
#> -> Host: data.sec.gov
#> -> User-Agent: Sample Company Name AdminContact@<sample company domain>.com
#> -> Accept: */*
#> -> Accept-Encoding: deflate, gzip
#> -> 
#> <- HTTP/1.1 200 OK
#> <- Content-Type: application/json
#> <- x-amzn-RequestId: c634dcbe-68aa-4777-9f18-4edfae752eb4
#> <- Access-Control-Allow-Origin: *
#> <- x-amz-apigw-id: IvJu4HiHIAMFidw=
#> <- X-Amzn-Trace-Id: Root=1-64c2bcc5-5db9315369e664da512cb6b5
#> <- Vary: Accept-Encoding
#> <- Content-Encoding: gzip
#> <- Expires: Thu, 27 Jul 2023 18:51:49 GMT
#> <- Cache-Control: max-age=0, no-cache, no-store
#> <- Pragma: no-cache
#> <- Date: Thu, 27 Jul 2023 18:51:49 GMT
#> <- Content-Length: 28594
#> <- Connection: keep-alive
#> <- Strict-Transport-Security: max-age=31536000 ; preload
#> <- Set-Cookie: ak_bmsc=E9...

resp
#> <httr2_response>
#> GET https://data.sec.gov/submissions/CIK0000320193.json
#> Status: 200 OK
#> Content-Type: application/json
#> Body: In memory (157568 bytes)

# first few keys / values from JSON:
resp_body_json(resp, simplifyVector = TRUE, flatten = TRUE) |>
  head(n = 10) |>
  str()
#> List of 10
#>  $ cik                              : chr "320193"
#>  $ entityType                       : chr "operating"
#>  $ sic                              : chr "3571"
#>  $ sicDescription                   : chr "Electronic Computers"
#>  $ insiderTransactionForOwnerExists : int 0
#>  $ insiderTransactionForIssuerExists: int 1
#>  $ name                             : chr "Apple Inc."
#>  $ tickers                          : chr "AAPL"
#>  $ exchanges                        : chr "Nasdaq"
#>  $ ein                              : chr "942404110"

创建于 2023-07-27,使用 reprex v2.0.2

我来自欧盟,我可以在浏览器中打开该 JSON URL,没有任何问题,但默认的

jsonlite
httr2
代理被阻止。仅当我也设置了
httr2
时,才可以使用带有
accept-language
的浏览器代理。他们检查用户代理中是否存在一些奇怪的模式,
"foo_bar"
- 不可以 /
"foo.bar"
- 可以

© www.soinside.com 2019 - 2024. All rights reserved.