Проблема при чтении URL-адресов из CSV-файла и получении вывода в CSV-файл, а также - PullRequest
0 голосов
/ 01 марта 2020

Предполагается, что приведенный ниже код возвращает код состояния и номер модели нескольких продуктов с веб-сайта https://www.selexion.be/. Это работало нормально, когда я помещал все URL-адреса в массив URL-адресов внутри кода, но когда я получаю CSV-файл URL-адреса, я получаю эту ошибку.

Также я хочу сохранить выходной URL-адрес, код состояния и модель номер в массиве и хотите передать sh (.flush() & os.fsync()) этот массив в файл CSV, когда будут получены все код состояния ссылки и номер модели. Потому что я получаю вывод в терминале, но я хочу вывод также и в CSV-файле.

Ошибка:

PS C:\Users\Zandrio> & C:/Users/Zandrio/AppData/Local/Programs/Python/Python38/python.exe "c:/Users/Zandrio/Documents/Advanced Project/Selexion.py"
Traceback (most recent call last):
  File "c:/Users/Zandrio/Documents/Advanced Project/Selexion.py", line 49, in <module>
    asyncio.run(main())
  File "C:\Users\Zandrio\AppData\Local\Programs\Python\Python38\lib\asyncio\runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "C:\Users\Zandrio\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 612, in run_until_complete
    return future.result()
  File "c:/Users/Zandrio/Documents/Advanced Project/Selexion.py", line 41, in main
    await asyncio.gather(*(worker(f'w{index}', url, session)
  File "c:/Users/Zandrio/Documents/Advanced Project/Selexion.py", line 32, in worker
    response = await session.get(url, headers=header)
  File "C:\Users\Zandrio\AppData\Local\Programs\Python\Python38\lib\site-packages\aiohttp\client.py", line 380, in _request
    url = URL(str_or_url)
  File "C:\Users\Zandrio\AppData\Local\Programs\Python\Python38\lib\site-packages\yarl\__init__.py", line 149, in __new__
    raise TypeError("Constructor parameter should be str")
TypeError: Constructor parameter should be str

Код:

import asyncio
import csv
import aiohttp
import time
from bs4 import BeautifulSoup

urls = []

try:

 with open('C:\\Users\\Zandrio\\Documents\\Advanced Project\\input_links.csv','r', newline='') as csvIO:
    urls = list(csv.reader(csvIO))

except FileNotFoundError:
    pass


header = {
'Host': 'www.selexion.be',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Cache-Control': 'max-age=0',
'TE': 'Trailers'
}


async def worker(name, url, session):
    response = await session.get(url, headers=header)
    html = await response.read()
    soup = BeautifulSoup(html, features='lxml').select_one('.title-options span:first-of-type').text
    print(f'URL: {url} - {response.status} - {soup}')


async def main():
     async with aiohttp.ClientSession() as session:
            await asyncio.gather(*(worker(f'w{index}', url, session)
                            for index, url in enumerate(urls)))


if __name__ == '__main__':
    start = time.perf_counter()
    asyncio.run(main())
    elapsed = time.perf_counter() - start
    print(f'Executed in {elapsed:0.2f} seconds')

1 Ответ

0 голосов
/ 01 марта 2020

В сообщении об ошибке указывается ошибка типа, означающая, что функция возвращает параметр типа A, но тип B был передан.

TypeError: Constructor parameter should be str

В строке

await asyncio.gather(*(worker(f'w{index}', url, session)

Какой тип URL? Вы можете узнать это с помощью

type(url)

или запустив отладчик.

Что происходит, когда вы переворачиваете эти две строки

 await asyncio.gather(*(worker(f'w{index}', url, session)
                            for index, url in enumerate(urls)))

Я не вижу, где URL исходит от иного.

...