В настоящее время мы пытаемся очистить steam.com, но HTML загружается только частично. В текущем коде используются запросы lib, но мы также пробовали urllib.request lib и получили тот же результат. в основном из того, что я могу собрать, он загружает только первую 1/10 страницы, прежде чем readyState == complete, затем делает что-то еще, чтобы пользователь мог технически начать навигацию по странице перед загрузкой остального содержимого. Я знаю, что запросы не очень хорошо обрабатывают загруженные js страницы, но мы попробовали urllib и получили тот же результат (вот почему я думаю, что некоторые нечетные js отправляются после readyState). Мы также пытались использовать селен, но, если говорить об этом с точки зрения непрофессионала, это «много значит». Он не предназначен для сканеров, и я не хочу открывать браузер без головы или разбираться со всем, что с ним происходит, и многое из того, что читается, говорит, что не следует использовать селен для очистки веб-страниц. Есть ли у кого-нибудь предложения о том, где мы могли бы улучшить, чтобы получить полную страницу? URL-адрес github: https://github.com/icarus612/spiderPY-steam,, и в одном из прошлых коммитов мы использовали urllib (возможно, мы делали это неправильно, или есть еще что-то, что мы могли бы добавить для запуска js?) и кодв настоящее время у нас есть:
import requests
from bs4 import BeautifulSoup as soup
import json
resp = requests.get("https://store.steampowered.com").content
page = soup(resp, 'lxml')
containers = page.find_all("a", {"class": "store_capsule"})
obj = []
print(len(containers))
for i, x in enumerate(containers):
id_to_find = x["data-ds-appid"]
title = page.find("div", {"id": f"hover_app_{id_to_find}"}).find("h4").text if page.find("div", {"id": f"hover_app_{id_to_find}"}) != None else id_to_find
if x.find("div", {"class": "discount_pct"}):
price_bd = x.find("div", {"class": "discount_original_price"}).text.strip() if x.find("div", {"class": "discount_original_price"}) else ""
price_ad = x.find("div", {"class": "discount_final_price"}).text.strip() if x.find("div", {"class": "discount_final_price"}) else ""
deal_pct = x.find("div", {"class": "discount_pct"}).text.strip() if x.find("div", {"class": "discount_pct"}) else ""
else:
price_bd = x.find("div", {"class": "discount_original_price"}).text.strip() if x.find("div", {"class": "discount_original_price"}) else ""
price_ad = price_bd
deal_pct = "0%"
image = x.find("img")["src"]
time_left = x.find("dailydeal_desc").text if x.find("dailydeal_desc") else "NA"
id_name = "".join(title.split(" "))
obj.append({"id": f"{i}", f"{id_name}" : {"title": f"{title}", "price before deal": f"{price_bd}", "price after deal": f"{price_ad}", "deal percent": f"{deal_pct}", "image_url": f"{image}", "time left" : f"{time_left}"}})
data = {"Products": []}
for i in obj:
data["Products"].append(i)
with open ("scraped.txt", "w") as s:
json.dump(data, s)
Код захватывает только первые 2 сделки (первый раздел HTML)