Как регулировать запросы GET из списка URL - PullRequest
0 голосов
/ 24 августа 2018

У меня есть список ~ 250000 URL, которые мне нужны для получения данных из API.

Я создал класс, используя библиотеку grequests для выполнения асинхронных вызовов. Тем не менее, ограничение API составляет 100 вызовов в секунду, что намного превосходит.

Код с использованием команд:

import grequests

lst = ['url.com','url2.com']

class Test:
    def __init__(self):
        self.urls = lst

    def exception(self, request, exception):
        print ("Problem: {}: {}".format(request.url, exception))

    def async(self):
        return grequests.map((grequests.get(u) for u in self.urls), exception_handler=self.exception, size=100000)


    def collate_responses(self, results):
        return [x.text for x in results]

test = Test()
#here we collect the results returned by the async function
results = test.async()

Можно ли в любом случае использовать библиотеку запросов для выполнения 100 вызовов в секунду?

Я попробовал запросы, но время ожидания истекло после примерно 100000 звонков.

В этом случае я передаю идентификатор в URL.

import requests
L = [1,2,3]

for i in L:
    #print (row)
    url = 'url.com/Id={}'.format(i)
    xml_data1 = requests.get(url).text
    lst.append(xml_data1)
    time.sleep(1)
    print(xml_data1) 

1 Ответ

0 голосов
/ 24 августа 2018

Использовать многопоточность.

from multiprocessing.dummy import Pool as ThreadPool
def some_fun(url):
    for i in L:
    #print (row)
    url = 'url.com/Id={}'.format(i)
    xml_data1 = requests.get(url).text
    lst.append(xml_data1)
    time.sleep(1)
    print(xml_data1) 

if __name__ == '__main__':
    lst = ['url.com','url2.com']
    c_pool = ThreadPool(30) #add as many as threads you can
    c_pool.map(some_fun, lst)
    c_pool.close()
    c_pool.join()

Ура! * * 1004

...