Проблемы с парсингом python
В парсерах я новичок. Может быть я чего то не понимаю, но в сети ответа так и не нашёл. Пытаюсь спарсить, ну например, инвентарь стим, стандартный набор: selenium/requests_html, которые умеют парсить с js, и BeautifulSoup. Но в итоге я получаю не полную страницу, которую вижу в браузере. Ок, пытаюсь разобраться, смотрим код страницы, Network -> XHR, ошибка, инициатор jquery-1.11.1.min.js... На сколько я понял, он запрашивает json, адрес понятен, так же могу этот json спарсить (https://steamcommunity.com/inventory/76561198113737845/440/2?l=russian&count=75). Ну а дальше то что? Как мне получить те данные, что я вижу в браузере, но которые не получаю через парсер? Я понимаю, что та информация, что мне нужна, уже есть в этом json, и с помощью регулярок я без проблем могу их от туда достать. Но мне нужна именно полноценная html страница, тк в json файле нет информации, например, о кол-ве одинаковых вещей.
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
from selenium import webdriver
from bs4 import BeautifulSoup
import time
link = 'https://steamcommunity.com/profiles/76561198113737845/inventory/#252490'
driver = webdriver.Chrome(executable_path='E:\\steam_pars\\chromedriver.exe')
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled') # отключаем режим Webdriver
try:
driver.get(url=link)
time.sleep(10)
steam_html = driver.page_source
soup = BeautifulSoup(steam_html, 'lxml')
block = soup.find('h1', class_='hover_item_name')
with open('test.html', 'w', encoding='utf-8') as file: # сохраняем страницу на всякий случай
file.write(steam_html)
print('*' * 10)
print(block.text) # естественно пустая строка
print('*' * 10)
except Exception as ex:
print(ex)
finally:
driver.close()
driver.quit()
Ответы (2 шт):
Я нашел ответ на свой вопрос:
html_with_all_content = driver.execute_script("return document.body.innerHTML;")
Как улучшить код.
Ниже — доработанная версия скрипта, которая:
- Ждёт, пока инвентарь реально загрузится (а не просто спит 10 секунд).
- Получает итоговый HTML через JS.
- Корректно закрывает драйвер.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
link = 'https://steamcommunity.com/profiles/76561198113737845/inventory/#252490'
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--headless') # можно убрать, если хочешь видеть браузер
service = Service('E:\\steam_pars\\chromedriver.exe')
driver = webdriver.Chrome(service=service, options=options)
try:
driver.get(link)
# ждём, пока появятся элементы с классом hover_item_name (они появляются после AJAX)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME, "hover_item_name"))
)
# получаем HTML через JS
html_with_all_content = driver.execute_script("return document.body.innerHTML;")
soup = BeautifulSoup(html_with_all_content, 'lxml')
# пример извлечения
items = soup.find_all('div', class_='item')
print(f"Найдено элементов: {len(items)}")
with open('test_full.html', 'w', encoding='utf-8') as file:
file.write(html_with_all_content)
except Exception as ex:
print("Ошибка:", ex)
finally:
driver.quit()