@robben_55

Парсинг стоимости инвентаря 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$..

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

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

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

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

В общем, проще переписать, чем исправить...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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