Поддерживать сеанс aiohttp активнымPython

Программы на Python
Ответить
Anonymous
 Поддерживать сеанс aiohttp активным

Сообщение Anonymous »

Я пытаюсь посещать веб-сайт каждые X секунд с параллельными и отдельными сеансами, а затем анализировать ответ, чтобы определить, следует ли продолжать каждый сеанс или нет. Однако, как только код достигает второго цикла, он терпит неудачу.

Код: Выделить всё

import asyncio
from aiohttp import ClientSession
import logging
import time

interval = 30
instances = 2
visit_url = 'http://www.example.org'

tasks = []

logging.basicConfig(
format='%(asctime)s.%(msecs)03d %(message)s',  # Log in format time.milliseconds {message}
level=logging.INFO,  # Use with logging.info()
datefmt='%H:%M:%S')  # Display time as Hours:Minutes:Seconds

class StopException(Exception):
pass

async def quit_app(session, task_, reason):
logging.info("[{}] {}.".format(task_, reason))
session.cookies.clear()  # Reset cookies
session.headers.clear()  # Reset headers
session.close()  # End HTTP connection
raise StopException

async def get_status(response):
if "abow" in response:
return "success"
elif "odoap" or "daoscp" in response:
return "waiting"
elif "nullt" in response:
return "fail"
elif "issue" in response:
return "banned"
elif "pending" in response:
return "pending"
else:
return "pending"

async def initialise(headers):
session = ClientSession()
task_ = len(asyncio.Task.all_tasks()) - instances - 1
passed = False
while passed is False:
async with session as session:
async with session.get(visit_url, headers=headers, allow_redirects=True) as initial:
status = await get_status(await initial.text())  # Check HTML for status
if status == "success":
logging.info("[{}] {}.".format(task_, "Success"))
passed = True
elif status == "pending":
logging.info("[{}] {}.".format(task_, "Pending.."))
await asyncio.sleep(interval)
elif status == "waiting":
logging.info("[{}] {}.".format(task_, "Waiting..."))
await asyncio.sleep(interval)
elif status == "banned":
await quit_app(initial, task_, "Banned")
elif status == "fail":
await quit_app(initial, task_, "Failed")

if __name__ == "__main__":
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9',
'upgrade-insecure-asks': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
}  # Add appropriate headers
start = time.clock()
loop = asyncio.get_event_loop()
for i in range(instances):
task = asyncio.ensure_future(initialise(headers))
tasks.append(task)
loop.run_until_complete(asyncio.wait(tasks))
end = time.clock()
print("Process took {0:.4f} seconds.".format(end - start))
Этот код возвращает следующую ошибку:


13:56:58.604 Исключение задачи никогда не было получено
Будущее: задача завершена coro= Initialise() Done, определено в
C:/Users/x/PycharmProjects/tests/src/aiohttp_main.py:49
Exception=RuntimeError('Сеанс закрыт',)
RuntimeError: Сеанс закрыт


Я просто не могу понять, как сделать так, чтобы сеансы оставались активными, пока я не .close() их...

Подробнее здесь: https://stackoverflow.com/questions/508 ... sion-alive
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»