У меня есть X начальных URL, которые разбиты на страницы - чтобы получить следующий набор данных, мне нужно извлечь следующий URL из заголовка ответа, пока не будет следующего URL. У меня возникли проблемы с получением правильной работы. Я пытаюсь использовать подход с очередями, который я нашел здесь.
import asyncio
from aiohttp import ClientSession, TCPConnector
async def get(session, url):
headers = {
'Authorization': 'Bearer KEY',
}
async with session.get(url, headers=headers) as response:
json = await response.json()
return json, response
async def process(session, url, q):
try:
try:
views, response = await get(session, url)
scode = response.status
if scode == 404:
return
except Exception as e:
print(e)
return
try:
await q.put(str(response.links["next"]["url"]))
except:
pass
<do something with views>
except Exception as e:
print(e)
async def fetch_worker(session, q):
while True:
url = await q.get()
try:
await process(session, url, q)
except Exception as e:
print(e)
finally:
q.task_done()
async def d():
<code to query and put data into stdrows>
connector = TCPConnector(limit=500)
async with ClientSession(connector=connector) as session:
url = '<some base url>'
for i in range(500):
tasks.append(asyncio.create_task(fetch_worker(session, url_queue)))
for row in stdrows:
await url_queue.put(url.format(row[1]))
await asyncio.gather(*tasks)
await url_queue.join()
asyncio.run(d())
Кажется, что это не 500 задач / с c. Возможно ли вообще достичь этого уровня, не зная заранее всех URL-адресов? Я надеюсь получить следующий URL-адрес из любого исходного URL-адреса (или из его разбитого на страницы URL-адреса), пока я работаю с views
.