Для парсинга сайтов с динамически подгружаемым контентом можно использовать следующее решение, вот пример рабочего кода для Вашего случая с использованием selenium:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options
url = f'https://store.steampowered.com/specials/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
}
def get_result(url, headers):
chrome_options = Options()
# chrome_options.binary_location = "/opt/google/chrome/google-chrome"
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
executable_path=".../chromedriver_linux64/chromedriver") # the path to your chromedriver
driver.get(url)
time.sleep(10) # You can wait until the page loads, but it's easier to wait 10 seconds, they will be enough with a margin
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
games = soup.find_all('div',
class_='salepreviewwidgets_StoreSaleDiscountedPriceCtn_3GLeQ')
for game in games:
price_original = f'Цена без скидки: {game.find("div",
class_="salepreviewwidgets_StoreOriginalPrice_1EKGZ").text}'
price_sale = f'Цена после скидки: {game.find("div",
class_="salepreviewwidgets_StoreSalePriceBox_Wh0L8").text}'
print(price_original)
print(price_sale)
def main():
get_result(url=url, headers=headers)
if __name__ == "__main__":
main()
Результат:
Цена без скидки: 385 руб
Цена после скидки: 38,50 руб
Цена без скидки: 999 руб
Цена после скидки: 199 руб
Цена без скидки: 419 руб
Цена после скидки: 335 руб
Цена без скидки: 1999 руб
Цена после скидки: 1319 руб
....