Как я могу уменьшить количество запросов и использовать только один? - PullRequest
0 голосов
/ 02 марта 2019

Моя программа делает это:

  1. Получить XML с моего сайта
  2. Запустить все URL-адреса
  3. Получить данные с моей веб-страницы (SKU, имя,название, цена и т. д.) с запросами
  4. Получите самую низкую цену с другого веб-сайта, сравнив цену с тем же SKU с запросами.

Я использую с большим количествомзапросов, по каждому определению:

def get_Price (SKU):
    check ='https://www.XXX='+SKU
    r = requests.get(check)
    html = requests.get(r.url)
    bsObj = BeautifulSoup(html.content,'html.parser')
    return Price

def get_StoreName (SKU):
    check ='https://XXX?keyword='+SKU
    r = requests.get(check)
    html = requests.get(r.url)
    bsObj = BeautifulSoup(html.content,'html.parser')
    return storeName

def get_h1Tag (u):
    html = requests.get(u)
    bsObj = BeautifulSoup(html.content,'xml')
    h1 = bsObj.find('h1',attrs={'itemprop':'name'}).get_text()
    return h1

Как можно уменьшить количество запросов или подключений к URL - и использовать с одним запросом или одним подключением во всей программе?

1 Ответ

0 голосов
/ 02 марта 2019

Я предполагаю, что это скрипт с группой методов, которые вы вызываете в определенном порядке.Если это так, то это хороший вариант использования для dict.Я написал бы функцию, которая запоминает обращения к URL-адресам.

Затем вы можете использовать эту функцию для других ваших функций:

requests_cache = {}

def get_url (url, format_parser):
    if url not in requests_cache:
        r = requests.get(url)
        html = requests.get(r.url)
        requests_cache[url] = BeautifulSoup(html.content, format_parser)
    return requests_cache[url]

def get_Price (makat):
    url = 'https://www.zap.co.il/search.aspx?keyword='+makat
    bsObj = get_url(url, 'html.parser')
    # your code to find the price
    return zapPrice

def get_zapStoreName (makat):
    url = 'https://www.zap.co.il/search.aspx?keyword='+makat
    bsObj = get_url(url, 'html.parser')
    # your code to find the store name
    return storeName

def get_h1Tag (u):
    bsObj = get_url(u, 'xml')
    h1 = bsObj.find('h1',attrs={'itemprop':'name'}).get_text()
    return h1

Если вы хотите избежать глобальной переменной, вы также можете установитьrequests_cache как атрибут get_url или как аргумент по умолчанию в определении.Последнее также позволит вам обойти кеш, передав пустой dict.

Опять же, здесь предполагается, что вы периодически запускаете этот код как скрипт.В этом случае requests_cache будет очищаться при каждом запуске программы.

Однако, если это часть более крупной программы, вы захотите «истечь» из кеша на регулярной основе, иначевы бы получали одинаковые результаты каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...