Я не уверен, какую разницу в производительности вы получите, но вы можете попробовать и проверить это решение.
import requests
from bs4 import BeautifulSoup
baseUrl = 'https://www.rsmalls.com/osrs-gold'
postUrl = 'https://www.rsmalls.com/index.php?route=common/quickbuy/rsdetail'
with requests.Session() as session:
res = session.get(baseUrl)
soup = BeautifulSoup(res.text, 'lxml')
game_id = soup.select_one("#choose-game > option[selected]")['value']
response = session.post(postUrl, data={'game_id': game_id}).json()
print(f"{'Gold Price:'} {response['price']}")
В этом коде сначала я получаю идентификатор «Runescape 2007»,на случай, если владелец сайта изменит его.Вы можете пропустить этот шаг и напрямую указать значение «345» в качестве идентификатора для следующего пост-запроса, если вы уверены, что он не изменится.
Цена загружена кодом JS, как вы упомянули.Используя инструменты разработки браузера, я мог получить фактический запрос POST, чтобы получить цену, для которой требуется идентификатор, выбранный из выпадающего списка.Запрос POST к https://www.rsmalls.com/index.php?route=common/quickbuy/rsdetail, дает ответ json, например:
{"success":true,"product_id":"30730","price":0.85,"server_id":"1661","server_option":"463","quantity":"1|5|10|20|50|100|200|300|500|1000|1500|2000","name":"M"}
Итак, я проанализировал ответ как json и получил от него цену.
Дайте мне знать, если у вас естьлюбые вопросы.
РЕДАКТИРОВАТЬ:
Существует другой запрос POST на https://rsmalls.com/runescape3-gold,, поэтому то же решение не работает.Запрос POST может быть разным для каждой страницы / веб-сайта / данных.Вы можете найти такой пост самостоятельно, используя devtools для браузера, как показано здесь.Справа, где вы видите, что выполняется POST-запрос к URL, внизу вы найдете также данные, отправленные на POST-запрос.Также обратите внимание, что в ответ на этот запрос он всегда отвечает с ценой 1 единица, поэтому он может не совпадать, если количество единиц по умолчанию на сайте больше 1 (например, 5 на скриншоте ниже).