3

我在工作中运行我的代码,并且运行顺利,但是在不同的网络(家庭 WiFi)上,我在访问CoinGecko V3 API时不断收到403错误。可以观察到,在私有浏览器上访问 API(对其进行测试)将提示安全检查(hCaptcha)能够继续。

https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=30

with requests.get(url) as source:
    print(source.status_code)

我还尝试了 pycoingecko(用于检查),但仍然返回类似的错误:

>>> from pycoingecko import CoinGeckoAPI
>>> cg = CoinGeckoAPI()
>>> cg.get_coin_market_chart_by_id(id='bitcoin', vs_currency='usd', days=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\...\Python39\lib\site-packages\pycoingecko\utils.py", line 12, in input_args
    return func(*args, **kwargs)
  File "C:\Users\...\Python39\lib\site-packages\pycoingecko\api.py", line 169, in get_coin_market_chart_by_id
    return self.__request(api_url)
  File "C:\Users\...\Python39\lib\site-packages\pycoingecko\api.py", line 29, in __request
    response.raise_for_status()
  File "C:\Users\...\Python39\lib\site-packages\requests\models.py", line 941, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=1

我猜 Cloudflare 怀疑我的网络活动,但显然我正在使用 Python 脚本来访问 API。有没有办法通过安全检查?

4

3 回答 3

0

我认为使用 scraperapi.com 将是一个很好的解决方法。在支付之前,您会收到数千个请求以查看它是否有效,并且设置非常容易 + 旨在处理这样的事情,您可能会遇到验证码/阻止等。

刚刚对其进行了测试并且对我来说可以正常工作:

import requests
payload = {'api_key': 'YOUR API KEY',
           'url': 'https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=30'}
with requests.get('http://api.scraperapi.com', params=payload) as source:
    print(source.status_code)
于 2021-07-23T00:08:55.523 回答
0

正如 CoinGecko 文档中所说,我只是尝试每分钟执行 50 多个请求,大约 200 次后,我开始出错

urllib.error.HTTPError: HTTP Error 429: Too Many Requests

因此,您看到的错误是特定活动的结果。

在您的情况下,我想唯一的方法是使用网络代理服务器或从一些远程服务器(如 AWS EC2 实例)运行解析,这很便宜并且可以用于解析。

于 2021-07-22T21:53:22.430 回答
0

我可以在命令行上复制对端点的调用:

curl -vv -H "user-agent: C" https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=USD&days=30

-vv- 额外的详细日志记录 - 显示来自服务器的请求/响应的详细信息

-H- 设置 HTTP 标头

user-agent: 标头设置为空白时,我没有收到任何响应。如果我将该值设置为任何非空值,例如C, ChromeChrome/91.0.0它就可以工作。

如果您可以在 python 中复制相同的内容,您应该得到相同的结果...... HTTP 是一种无状态协议。如果它不起作用,那么还有其他东西在起作用。

于 2021-07-22T20:50:24.927 回答