Предполагается, что приведенный ниже код возвращает код состояния и номер модели нескольких продуктов с веб-сайта 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')