BeautifulSoup4 - Парсинг по сайту
Пытаюсь через BeautifulSoup4 вытащить из этого кода id="730_2_23995050630" но никак не выходит. Пробовал так:
soup = BeautifulSoup(response.text, "lxml")
BFSearch = soup.find_all("div", {"class": "itemHolder"})
print(BFSearch)
Но он находит только последнею строку на странице по данным фильтрам(Именно последнею строку мне не нужно) Так же пробовал так:
BFSearch = soup.find_all("div", class_ = "itemHolder")
Выдаёт тоже самое что и первый раз. Вот код странице, может кто поможет? (Я только учусь,1 день работаю с BS4)
<div class="itemHolder">
<div class="item app730 context2" id="730_2_23995050630" style="background-image: url(""); background-color: rgb(126, 126, 126); border-color: rgb(176, 195, 217);" data-processed="true" data-realtime-price="0"><img src="https://community.cloudflare.steamstatic.com/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpopuP1FBRw7ODYYzxb08-3moS0n_L1JaKfxToF6pQo0riT9I-hiQzk_kNrZjymI4CXIVdtYVyF_QO3l-fuhMDvuYOJlyX0AsTPow/96fx96f">
<a
href="#730_2_23995050630" class="inventory_item_link"></a>
<div class="swt_icon"></div>
<div class="itemcount" data-classid="4646703570"></div>
<div class="perItemDate not_tradable">7d</div>
<div class="exteriorSTInfo">
<span class="souvenirYellow"></span>
<span class="stattrakOrange"></span>
<span class="exteriorIndicator">BS</span>
</div>
<div class="stickerPrice"></div>
<div class="priceIndicator">₽2.25</div>
<div class="floatIndicator">0.6066</div>
<div class="p-price"></div>
</div>
</div>
Ответы (1 шт):
Как я понимаю вопрос получения id? Можно по разному искать
Я бы через css-селектор искал. Так мы найдем все теги с классом item, у которых есть атрибут id и у которых родительских тег имеет класс itemHolder:
items = soup.select(".itemHolder > .item[id]")
А чтобы получить id:
print([el['id'] for el in items])
UPD.
Предметы заполняются при выполнении javаscript кода на сайте, поэтому bs4 не смог и получить
Можно использовать selenium или его аналог с javаscript-движком, но можно и без них обойтись, но нужно будет поразбираться с кодом сайта на стороне клиента
Посмотрев на ajax-запросы сайта в инспекторе браузера на вкладке Сети увидел запрос: https://steamcommunity.com/inventory/76561198881890346/440/2?l=russian&count=75. Мои предположения, что:
76561198881890346- это профиль440- id приложения2- какой-тоcontextid, без понятия откуда это, возможно магическое число
По запросу в ответ приходит такой JSON:
{
"assets": [
{
"appid": 440,
"contextid": "2",
"assetid": "9980235616",
"classid": "331369",
"instanceid": "3673300869",
"amount": "1"
},
{
"appid": 440,
"contextid": "2",
"assetid": "9980256674",
"classid": "4724536",
"instanceid": "11040580",
"amount": "1"
}
],
"descriptions": [
{
"appid": 440,
"classid": "331369",
"instanceid": "3673300869",
"currency": 0,
"background_color": "3C352E",
"icon_url": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgECaDgTXB_lvQdBmsfoF_ezBOESnN975sgC32I_xFV-MrvnMjNic1GUUKEND_Bu9l-4CHYz7sM7BY7j87gDfxKv6tWeoo5XMA",
"icon_url_large": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgECaDgTXB_lvQdBmsfoF_ezBOESnN975sgC32I_xFV-MrvnMjNic1GUUKEND_Bu9l-4CHYz7sM7BY7j87gDfxKv6tWeoo5XMA",
"descriptions": [
{
"value": "Дата найма: Thursday, December 5, 2019 (21:34:56) по Гринвичу"
},
{
"value": "Хоть ты и опоздал на вечеринку, все равно именно ты был душой компании."
},
{
"value": " "
},
{
"value": "(Нельзя обменять или продать)"
}
],
"tradable": 0,
"actions": [
{
"link": "http://wiki.teamfortress.com/scripts/itemredirect.php?id=166&lang=ru_RU",
"name": "Статья в вики"
},
{
"link": "steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11838274993395608916",
"name": "Осмотреть в игре"
}
],
"name": "Наёмник ",
"name_color": "7D6D00",
"type": "Значок 5-го уровня",
"market_name": "Наёмник ",
"market_hash_name": "Mercenary",
"market_actions": [
{
"link": "steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11838274993395608916",
"name": "Осмотреть в игре"
}
],
"commodity": 0,
"market_tradable_restriction": 7,
"market_marketable_restriction": 0,
"marketable": 0,
"tags": [
{
"category": "Quality",
"internal_name": "Unique",
"localized_category_name": "Качество",
"localized_tag_name": "уникальный",
"color": "7D6D00"
},
{
"category": "Type",
"internal_name": "misc",
"localized_category_name": "Тип",
"localized_tag_name": "Аксессуар"
},
{
"category": "Class",
"internal_name": "Scout",
"localized_category_name": "Класс",
"localized_tag_name": "Scout"
},
{
"category": "Class",
"internal_name": "Sniper",
"localized_category_name": "Класс",
"localized_tag_name": "Sniper"
},
{
"category": "Class",
"internal_name": "Soldier",
"localized_category_name": "Класс",
"localized_tag_name": "Soldier"
},
{
"category": "Class",
"internal_name": "Demoman",
"localized_category_name": "Класс",
"localized_tag_name": "Demoman"
},
{
"category": "Class",
"internal_name": "Medic",
"localized_category_name": "Класс",
"localized_tag_name": "Medic"
},
{
"category": "Class",
"internal_name": "Heavy",
"localized_category_name": "Класс",
"localized_tag_name": "Heavy"
},
{
"category": "Class",
"internal_name": "Pyro",
"localized_category_name": "Класс",
"localized_tag_name": "Pyro"
},
{
"category": "Class",
"internal_name": "Spy",
"localized_category_name": "Класс",
"localized_tag_name": "Spy"
},
{
"category": "Class",
"internal_name": "Engineer",
"localized_category_name": "Класс",
"localized_tag_name": "Engineer"
}
]
},
{
"appid": 440,
"classid": "4724536",
"instanceid": "11040580",
"currency": 0,
"background_color": "3C352E",
"icon_url": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEKYAsuUBrstjtCmPfqDOCLDa5SmI1mtZMC2zRqwlIvbOHnZ2UwJFfGBfkGCvdop1DoWXdq68UzUYe3uasILr2NNqzy",
"icon_url_large": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEKYAsuUBrstjtCmPfqDOCLDa5SmI1mtZMC2zRqwlIvbOHnZ2UwJFfGBfkGCvdop1DoWXdq68UzUYe3uasILr2NNqzy",
"descriptions": [
{
"value": ""
},
{
"value": " "
},
{
"value": "(Нельзя обменять, продать или перековать)"
}
],
"tradable": 0,
"actions": [
{
"link": "http://wiki.teamfortress.com/scripts/itemredirect.php?id=261&lang=ru_RU",
"name": "Статья в вики"
},
{
"link": "steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D13892627020785158121",
"name": "Осмотреть в игре"
}
],
"name": "Кепка Манн Ко ",
"name_color": "7D6D00",
"type": "Головной убор 10-го уровня",
"market_name": "Кепка Манн Ко ",
"market_hash_name": "Mann Co. Cap",
"market_actions": [
{
"link": "steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D13892627020785158121",
"name": "Осмотреть в игре"
}
],
"commodity": 0,
"market_tradable_restriction": 7,
"market_marketable_restriction": 0,
"marketable": 0,
"tags": [
{
"category": "Quality",
"internal_name": "Unique",
"localized_category_name": "Качество",
"localized_tag_name": "уникальный",
"color": "7D6D00"
},
{
"category": "Type",
"internal_name": "misc",
"localized_category_name": "Тип",
"localized_tag_name": "Аксессуар"
},
{
"category": "Class",
"internal_name": "Scout",
"localized_category_name": "Класс",
"localized_tag_name": "Scout"
},
{
"category": "Class",
"internal_name": "Sniper",
"localized_category_name": "Класс",
"localized_tag_name": "Sniper"
},
{
"category": "Class",
"internal_name": "Soldier",
"localized_category_name": "Класс",
"localized_tag_name": "Soldier"
},
{
"category": "Class",
"internal_name": "Demoman",
"localized_category_name": "Класс",
"localized_tag_name": "Demoman"
},
{
"category": "Class",
"internal_name": "Medic",
"localized_category_name": "Класс",
"localized_tag_name": "Medic"
},
{
"category": "Class",
"internal_name": "Heavy",
"localized_category_name": "Класс",
"localized_tag_name": "Heavy"
},
{
"category": "Class",
"internal_name": "Pyro",
"localized_category_name": "Класс",
"localized_tag_name": "Pyro"
},
{
"category": "Class",
"internal_name": "Spy",
"localized_category_name": "Класс",
"localized_tag_name": "Spy"
},
{
"category": "Class",
"internal_name": "Engineer",
"localized_category_name": "Класс",
"localized_tag_name": "Engineer"
}
]
}
],
"total_inventory_count": 2,
"success": 1,
"rwgrsn": -2
}
Тогда, чтобы получить вещи делаем такой код:
import requests
url = 'https://steamcommunity.com/inventory/76561198881890346/440/2?l=russian&count=75'
rs = requests.get(url)
data = rs.json()
assets = data['assets']
id_by_item = {
item['instanceid']: item
for item in data['descriptions']
}
for asset in assets:
app_id = asset['appid']
context_id = asset['contextid']
asset_id = asset['assetid']
instance_id = asset['instanceid']
item_name = id_by_item[instance_id]['name'].strip()
print(f'ID: {app_id}_{context_id}_{asset_id}. Name: {item_name}')
Результат:
ID: 440_2_9980235616. Name: Наёмник
ID: 440_2_9980256674. Name: Кепка Манн Ко