Python запросов библиотека создает новое соединение каждый раз - PullRequest
1 голос
/ 28 апреля 2020

Приветствую всех, я пишу python программу, которая требует 1000+ cURL запросов. Он генерирует запрос cURL и получает JSON, а затем обрабатывает его и делает это для более 1000+ URL-адресов. Если я попытаюсь сделать это обычным образом, это займет около 20 минут, но это нужно сделать за 3 минуты.

Так что после нескольких часов исследований самым эффективным решением, которое я нашел, было многопоточность в сочетании с Keep-Alive TCP подключением.

Поэтому в основном я пытаюсь получить некоторую информацию о нескольких продуктах с веб-сайта через web-scrapping.

Следующая программа иллюстрирует ЖЕ

import requests
import json
import time

s = requests.Session()

def getInfo(productName):
        # this try block tries to get information and then parse it and then display a few  
        # parameters about the particular product...
        try:

            # this is just an example URL...
            URL = "www.example.com/products/"+productName
            r = s.get(URL,headers)
            result = json.loads(r.text)
            print(result['information'])

        except json.decoder.jsonDecodeError:


            print("Unable to process data for " + productName)

products = [product1, product2, product3... productN]
counter = 1
mainThread = threading.current_thread()

for product in products:

        # this if block checks if this is the fifth iteration of the for loop...
        # if yes then change tcp connection...

        if counter%5 == 0:

            # wait until all other threads except the main thread are completed, cause we don't 
            # want to drop the connection in the middle of a request...

            threads = threading.enumerate()
            for thread in threads:

                if thread is mainThread:
                    continue

                thread.join()

            print("Connection Switched")
            # establish a new connection...
            s = requests.Session()
            # hold on for a sec
            time.delay(1)
        # start a new thread for getting info about the current 'prouct'
        thread = threading.Thread(target=getInfo,args=(product,))
        thread.start()

print("Done")

Обратите внимание, что код был упрощенной версией реального кода ...

В любом случае ...

Я не знаю По какой причине моя программа создает новое TCP-соединение для каждого product. В журналах ничего особенного, только основные c вещи ...

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (2): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (3): www.example.com
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (4): www.example.com
...

Даже после нескольких часов поиска я не могу найти достаточно подходящего решения.

Вот некоторые из вещей, которые у меня есть TRIED

Приведенные выше две ссылки - просто связанные вопросы, поэтому в принципе я пока не пробовал какого-либо разумного решения.

Было бы очень полезно, если бы вы могли помочь мне с этой странной загадкой ...

Спасибо заранее

...