Парсинг стоимости инвентаря Steam CS:GO?

link_inv = "https://steamcommunity.com/id/{}/inventory/json/730/2"
GUN_URL = "https://steamcommunity.com/market/priceoverview/?appid=730&currency=1&market_hash_name={}"



async def get_inventory(steam_id):
    r = requests.get(link_inv.format(steam_id)).json()
    x = r["rgDescriptions"]
    for item in x:
        if x[item]["marketable"] == 1 and x[item]["tradable"] == 1:
            task2 = asyncio.create_task(get_quantity(x[item]["classid"], r["rgInventory"]))
            quantity = await task2
            collection_data = [(x[item]["market_hash_name"], quantity) for item in x]
        else:
            continue
    return collection_data

async def get_quantity(classid, inventory):
    counter = 0
    for item in inventory:
        if inventory[item]["classid"] == classid:
            counter += 1
    return counter

async def get_price(skin):
    total_price = 0
    for item in skin:
        async with aiohttp.ClientSession() as session:
            async with session.get(GUN_URL.format(item[0])) as resp:
                r = await resp.json()

                if r is None:
                    continue
                elif r["success"] is False:
                    continue

                try:
                    if r["lowest_price"] and r["median_price"] is None:
                        continue
                except KeyError:
                    continue
                try:
                    lowest_price = str(r["lowest_price"])
                except KeyError:
                    lowest_price = str(r["median_price"])

                lowest_price = float(lowest_price.strip("$"))
                total_price = total_price + (lowest_price * (float(item[1])))
    return round(total_price, 2)
    


async def main():
    steam_id = input("Enter your SteamID: ")
    task = asyncio.create_task(get_inventory(steam_id))
    await asyncio.gather(task)
    xxx = task.result()
    task1 = asyncio.create_task(get_price(xxx))
    await asyncio.gather(task1)
    print('$'+str(task1.result()))

if __name__ == "__main__":
    asyncio.run(main())


Здраствуйте! В универе сказали сделать парсер цены инвентаря в стиме. Помогите, что в нем не так ? Когда я делаю дебаггинг шаг за шагом, желаемый результат выходит(цена инвентаря) , а когда запускаю код и ввожу стимайди, программа показывает результат, но так же внизу выходит вот такое

Enter your SteamID: silencers77
$0.51
Exception ignored in:
Traceback (most recent call last):
File "C:\Users\Ruslan\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 116, in __del__
self.close()
File "C:\Users\Ruslan\AppData\Local\Programs\Python\Python39\lib\asyncio\proactor_events.py", line 108, in close
self._loop.call_soon(self._call_connection_lost, None)
File "C:\Users\Ruslan\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 746, in call_soon
self._check_closed()
File "C:\Users\Ruslan\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 510, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed


Так же код не досчитывает цену инвентарей, в которых больше 100 вещей например, допустим цена 45$, но output показывает , что 7$..

Укажите ошибки, пожалуйста. Можно кодом, можно и словами. Буду благодарен. Всем добра!
  • Вопрос задан
  • 1924 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Очень странный код. А зачем ты вообще используешь create_task() и gather()?
create_task() имеет смысл, если хочешь вызвать корутину так, чтобы она выполнялась независимо от вызывающей.
gather() имеет смысл, если у тебя НЕСКОЛЬКО корутин, и ты хочешь выполнить их параллельно, а потом дождаться, когда все выполнятся.

А в твоём случае должно быть достаточно
xxx = await get_inventory(steam_id)

Далее, зачем у тебя get_quantity() вызывается асинхронно, да еще и опять через create_task()?
Она не выполняет никакого ввода-вывода, да и ЦПУ не особо загрузит, оставь её синхронной и вызывай как обычно.

Далее, ты используешь в куче синхроную requests и асинхронную aiohttp. Выбери что-нибудь одно? Я бы остановился на aiohttp, раз уж аснихронный код пишешь.

В общем, проще переписать, чем исправить...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@justabit
Странный универ который парсит цены игровых предметов... Что ещё, биточки закупать код? )))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы