Получение всего html из страницы, представленной JavaScript, используя python (но не селен) - PullRequest
0 голосов
/ 15 октября 2019

В настоящее время мы пытаемся очистить 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...