Как решить проблему: aiohttp + asyncio = TypeError: Constructor parameter should be str
Я новичок и пытаюсь получить коды ответов сайта. Удалось реализовать через requests, но это занимает много времени, чтобы получить около 10 000 страниц. Я пытаюсь сделать асинхронный метод, но получаю ошибку: TypeError: Constructor parameter should be str
Мне нужно получить код ответа типа 200 или 404, чтобы добавить его в таблицу excel.
import asyncio
import time
import aiohttp
import pandas as pd
from openpyxl import load_workbook
import datetime
start = time.time()
# Указываем путь к файлу с ссылками. Ссылки в файле начинаются с ячейки A2 и идут столбцом
wb = load_workbook(filename='Links.xlsx')
# Указываем наименование страницы с ссылками в файле
sheet = wb['Links']
row_count = sheet.max_row
# Заготовки пустых списков на будущее
urls = []
answers = []
# Создание переменной для добавления даты к наименованию итогового файла
date = datetime.datetime.now()
# Формирование списка ссылок для проверки. Перебор начинается со второй ячейки и завершается на последней ячейки
url_number = 0
for i in range(2, row_count + 1):
urls.append(sheet['A' + str(i)].value)
url_number += 1
print('Получение ссылки: ', url_number, 'из ', row_count - 1)
def get_tasks(session):
tasks = []
for _ in urls:
tasks.append(session.get(aiohttp.ClientResponse))
return tasks
async def get_response_code():
async with aiohttp.ClientSession() as session:
tasks = get_tasks(session)
responses = await asyncio.gather(*tasks)
for response in responses:
answers.append(await response)
asyncio.run(get_response_code())
# response = [grequests.get(url) for url in urls]
# resp = grequests.map(response)
#
#
# for num, r in enumerate(resp):
# answers.append(r.status_code)
# Формирование таблицы со ссылками и кодами ответов
df = pd.DataFrame({
'LINKS': urls,
'ANSWERS': answers
})
# Сохранение таблицы без индекса в новый файл. В наименовании файла указана дата формирования
df.to_excel('page response codes ' + date.strftime("%Y.%m.%d") + '.xlsx', index=False)
end = time.time()
print(end - start)
Получаю ошибку:
Traceback (most recent call last):
File "/Users/levon.osipov/Documents/Projects/lmAsync/main.py", line 47, in <module>
asyncio.run(get_response_code())
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 650, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/Users/levon.osipov/Documents/Projects/lmAsync/main.py", line 43, in get_response_code
responses = await asyncio.gather(*tasks)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/levon.osipov/Documents/Projects/lmAsync/venv/lib/python3.11/site-packages/aiohttp/client.py", line 1125, in send
return self._coro.send(arg)
^^^^^^^^^^^^^^^^^^^^
File "/Users/levon.osipov/Documents/Projects/lmAsync/venv/lib/python3.11/site-packages/aiohttp/client.py", line 423, in _request
url = self._build_url(str_or_url)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/levon.osipov/Documents/Projects/lmAsync/venv/lib/python3.11/site-packages/aiohttp/client.py", line 357, in _build_url
url = URL(str_or_url)
^^^^^^^^^^^^^^^
File "/Users/levon.osipov/Documents/Projects/lmAsync/venv/lib/python3.11/site-packages/yarl/_url.py", line 154, in __new__
raise TypeError("Constructor parameter should be str")
TypeError: Constructor parameter should be str