为 Google 添加 time.sleep() 方法 在 python 中翻译 API

Adding a time.sleep() method for Google Translate API in python

我正在设置一个 Django 视图,从 API 请求产品数据,使用 BeautifulSoup 解析它们,应用 googletrans 模块并保存响应进入我的 Postgresql 数据库。当我 运行 我的脚本时出现 429 HTTP 错误,因为我一次发送了很多请求,我被建议添加一个 time.sleep() 2 秒的方法来解决这个问题。

唯一的问题是我不确定我应该把这个方法放在我的脚本中的什么地方,我需要确保它是正确的方法,然后再冒着让我的 IP 地址被 Google tranlsate API 再次。

这是我的观点:

from bs4 import BeautifulSoup
from googletrans import Translator
import requests
import json


def api_data(request):
    if request.GET.get('mybtn'):  # to improve, == 'something':
        resp_1 = requests.get(
            "https://www.headout.com/api/public/v1/product/listing/list-by/city?language=fr&cityCode=PARIS&limit=5000&currencyCode=CAD",
            headers={
                "Headout-Auth": HEADOUT_PRODUCTION_API_KEY
            })
        resp_1_data = resp_1.json()
        base_url_2 = "https://www.headout.com/api/public/v1/product/get/"

        translator = Translator()

        for item in resp_1_data['items']:
            print('translating item {}'.format(item['id']))
            # concat ID to the URL string
            url = '{}{}'.format(base_url_2, item['id'] + '?language=fr')

            # make the HTTP request
            resp_2 = requests.get(
                url,
                headers={
                    "Headout-Auth": HEADOUT_PRODUCTION_API_KEY
                })
            resp_2_data = resp_2.json()

            descriptiontxt = resp_2_data['contentListHtml'][0]['html'][0:2040] + ' ...'

            #Parsing work
            soup = BeautifulSoup(descriptiontxt, 'lxml')
            parsed = soup.find('p').text

            #Translation doesn't work
            translation = translator.translate(parsed, dest='fr')

            titlename = item['name']
            titlefr = translator.translate(titlename, dest='fr')

            destinationname = item['city']['name']
            destinationfr = translator.translate(destinationname, dest='fr')

            Product.objects.get_or_create(
                title=titlefr.text,
                destination=destinationfr.text,
                description=translation.text,
                link=item['canonicalUrl'],
                image=item['image']['url']
            )

    return render(request, "form.html")

这是我想出来的,可以吗?

  Product.objects.get_or_create(
      title=titlefr.text,
      destination=destinationfr.text,
      description=translation.text,
      link=item['canonicalUrl'],
      image=item['image']['url']
  )time.sleep(2) #here

或者像这样:

resp_1 = requests.get(
            "https://www.headout.com/api/public/v1/product/listing/list-by/city?language=fr&cityCode=PARIS&limit=5000&currencyCode=CAD",
            headers={
                "Headout-Auth": HEADOUT_PRODUCTION_API_KEY
            }, time.sleep(2)) #or here

请帮忙。

编辑

根据@jay 的回答,这是正确的吗?

  Product.objects.get_or_create(
      title=titlefr.text,
      destination=destinationfr.text,
      description=translation.text,
      link=item['canonicalUrl'],
      image=item['image']['url']
  )

  #at the very end of the for loop
  time.sleep(2)

我会建议在 for 循环的最后,这样它会在重新循环之前等待 2 秒。

        destinationname = item['city']['name']
        destinationfr = translator.translate(destinationname, dest='fr')

        Product.objects.get_or_create(
            title=titlefr.text,
            destination=destinationfr.text,
            description=translation.text,
            link=item['canonicalUrl'],
            image=item['image']['url']
        )
        time.sleep(2)

return render(request, "form.html")