Идентификатор API перевода Google блокирует IP-адрес для слишком большого количества запросов - PullRequest
1 голос
/ 01 июня 2019

Я настраиваю Django Представления, которые запрашивают данные о продуктах из API, анализируют их с помощью BeautifulSoup, применяют модуль googletrans и сохраняют ответ в моей базе данных Postgresql.

Вчера все работало нормально, пока внезапно Google не заблокировал доступ к моему IP-адресу для слишком большого количества запросов одновременно.

Я только что включил свой LTE, чтобы изменить свой IP-адрес, и это сработало.

Но теперь, чтобы убедиться, что с этим IP-адресом это не произойдет снова, мне нужно найти способ вызывать googletrans 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")

Как вызвать API перевода Google в пакетном режиме? Или есть другое решение для этого?

Пожалуйста, помогите.

EDIT

Исходя из @ ddor254, куда мне положить: time.sleep(2)?

Это то, с чем я выступил, это нормально?

  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)) #here

Просто хочу убедиться, что это правильный способ, прежде чем рискнуть получить этот новый IP-адрес, также заблокированный.

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Предлагаю вам прочитать эту статью из MDN: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429

если это ответ, который вы получаете, попробуйте взглянуть на заголовок Retry-After в объекте ответа.

поэтому добавление режима ожидания или другого метода задержки со значением этого заголовка может решить вашу проблему.

0 голосов
/ 25 июня 2019

Попробуйте добавить задержки между последовательными запросами (используя спящий режим) и поиграйтесь с числами, чтобы увидеть, что работает для вас.Задержка в 2 с после каждой пары переводов и 15 с после каждых 10 для меня отлично работает.

...