#python #json #web-scraping #beautifulsoup
#python #json #веб-очистка #beautifulsoup
Вопрос:
Я пытаюсь очистить эту страницу: https://store.steampowered.com/search/results/?queryamp;start=0amp;count=50amp;dynamic_data=amp;sort_by=_ASCamp;snr=1_7_7_7000_7amp;filter=topsellersamp;infinite=1
Я попытался использовать beautiful soup, но там написано: TypeError: unhashable тип: ‘slice’ Эта ошибка возникает в строке синтаксического анализа. Я не могу использовать обычную страницу для создания красивого супа, так как функция очистки всего занимает слишком много времени. Мне нужно получить информацию для каждого элемента, такую как название игры, дата выпуска, скидка, цена и URL-адрес через эту страницу.
Вот мой код
browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)
browser.get("https://store.steampowered.com/search/results/?queryamp;start=0amp;count=50amp;dynamic_data=amp;sort_by=_ASCamp;snr=1_7_7_7000_7amp;filter=topsellersamp;infinite=1")
url = browser.current_url
page = requests.get(url)
data = page.json()
soup = BeautifulSoup(data, "html.parser")
Ответ №1:
Нет необходимости использовать selenium
(слишком медленно).
Шаги просты: проанализируйте json и преобразуйте results_html
в soup:
import requests
from bs4 import BeautifulSoup
url = 'https://store.steampowered.com/search/results/?queryamp;start=0amp;count=50amp;dynamic_data=amp;sort_by=_ASCamp;snr=1_7_7_7000_7amp;filter=topsellersamp;infinite=1'
response = requests.get(url)
soup = BeautifulSoup(response.json()['results_html'], "html.parser")
for game_info in soup.find_all(class_="search_result_row ds_collapse_flag"): # iterate this
print("url: ",game_info.get("href"))
print("name: ", game_info.find(class_="title").text.strip())
print("Released: ", game_info.find(class_="search_released").text.strip())
for price in game_info.find(class_="search_price"): # filter origin price.
if price and price.name != 'span': # just check the tag.
real_price = price
print("Price: ", real_price.strip())
discount = game_info.find(class_="search_discount").text.strip()
if discount: # check whether discount exists
print("Discount: ", discount)
else:
print("No discount")
print()
С принтами:
url: https://store.steampowered.com/app/1091500/Cyberpunk_2077/?snr=1_7_7_7000_150_1
name: Cyberpunk 2077
Released: 9 Dec, 2020
Price: ¥ 298
No discount
url: https://store.steampowered.com/app/578080/PLAYERUNKNOWNS_BATTLEGROUNDS/?snr=1_7_7_7000_150_1
name: PLAYERUNKNOWN'S BATTLEGROUNDS
Released: 21 Dec, 2017
Price: ¥ 98
No discount
url: https://store.steampowered.com/app/431960/Wallpaper_Engine/?snr=1_7_7_7000_150_1
name: Wallpaper Engine
Released: 16 Nov, 2018
Price: ¥ 19
No discount
url: https://store.steampowered.com/app/1404210/Red_Dead_Online/?snr=1_7_7_7000_150_1
name: Red Dead Online
Released: 4 Dec, 2020
Price: ¥ 35
No discount
url: https://store.steampowered.com/app/1406990/NEKOPARA_Vol_4/?snr=1_7_7_7000_150_1
name: NEKOPARA Vol. 4
Released: 26 Nov, 2020
Price: ¥ 33
Discount: -11%
.....