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

在python中为Google Translate API添加time.sleep()方法,python,django,sleep,google-translate,Python,Django,Sleep,Google Translate,我正在设置一个Django视图,该视图从API请求产品数据,使用BeautifulSoup解析它们,应用googletrans模块,并将响应保存到我的Postgresql数据库中。我在运行脚本时出现429HTTP错误,因为我一次发送多个请求,并且有人建议我添加一个time.sleep()2秒的方法来解决问题 唯一的问题是,我不确定该将此方法放在脚本中的何处,我需要确保这样做是正确的,以免再次冒着被Google translsate API阻止的风险 以下是我的看法: from bs4 impor

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

唯一的问题是,我不确定该将此方法放在脚本中的何处,我需要确保这样做是正确的,以免再次冒着被
Google translsate 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 answer,这是正确的吗

  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_或_create(
title=titlefr.text,
destination=destinationfr.text,
description=translation.text,
link=item['canonicalUrl'],
image=项目['image']['url']
)
时间。睡眠(2)
返回呈现(请求“form.html”)

有什么问题?告诉我们错误。你到底为什么需要或想要一个刮板来从API调用中获取数据?我刚刚检查了URL,它像我预期的那样返回JSON数据。像BS这样的东西只用于从HTML页面获取数据,这本身就是一个混乱的过程——如果网站提供了一个很好的API来直接访问数据,那就完全没有必要了。我想知道我应该在上面的代码中把time.sleep()方法放在哪里。因为最初,当我运行此代码时,出现429错误,Google translate阻止了我的IP地址,因为请求太多。@RobinZigmond我同意你的说法,但我们需要控制数据,因为我们有一个手动应用的机器学习模型。正在工作!你认为1秒会好吗,因为做2sec对于1000个项目来说相当长……我不知道。我不熟悉谷歌的机器人拦截器。老实说,我会——从random导入randint——然后使用time.sleep(randint(1,3)),如果你想表现得很好,这能做什么?这是不是将每个循环的时间从1秒随机更改为3秒?很酷,我想现在我会继续使用2sec,以确保我不会再次被阻塞