#python #selenium #beautifulsoup
Вопрос:
У меня было много проблем при попытке создать веб-страницы на Python с помощью BeautifulSoup. Поскольку эта конкретная веб-страница динамична, я пытался сначала использовать Selenium, чтобы «открыть» веб-страницу, прежде чем пытаться работать с динамическим контентом с помощью BeautifulSoup.
Проблема, с которой я сталкиваюсь, заключается в том, что динамический контент отображается в моем выводе HTML только тогда, когда я вручную прокручиваю веб-сайт при запуске программы, в противном случае эти части HTML остаются пустыми, как если бы я просто использовал BeautifulSoup сам по себе без Селена.
Вот мой код:
import time from bs4 import BeautifulSoup from selenium import webdriver if __name__ == "__main__": options = webdriver.ChromeOptions() options.add_argument('--ignore-certificate-errors') options.add_argument('--incognito') # options.add_argument('--headless') driver = webdriver.Chrome("C:Program Files (x86)chromedriver.exe", chrome_options=options) driver.get('https://coinmarketcap.com/') time.sleep(5) html = driver.page_source soup = BeautifulSoup(html, "html.parser") tbody = soup.tbody trs = tbody.contents for tr in trs: print(tr) driver.close()
Теперь, если у меня есть Selenium open Chrome с включенной опцией без головы, я получаю тот же результат, который обычно получаю без предварительной загрузки страницы. То же самое происходит, если я не нахожусь в безголовом режиме и просто позволяю странице загружаться самостоятельно, без прокрутки содержимого вручную. Кто — нибудь знает, почему это так? Есть ли способ загрузить динамический контент без прокрутки вручную при каждом запуске кода?
Ответ №1:
На самом деле данные динамически загружаются javascipt. Таким образом, вы можете легко получать данные из api-вызовов json-ответа:
Вот рабочий пример:
Код:
import requests import json url= 'https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing?start=1amp;limit=100amp;sortBy=market_capamp;sortType=descamp;convert=USD,BTC,ETHamp;cryptoType=allamp;tagType=allamp;audited=falseamp;aux=ath,atl,high24h,low24h,num_market_pairs,cmc_rank,date_added,max_supply,circulating_supply,total_supply,volume_7d,volume_30d' r = requests.get(url) for item in r.json()['data']['cryptoCurrencyList']: name = item['name'] print('crypto_name:' str(name))
Выход:
crypto_name:Bitcoin crypto_name:Ethereum crypto_name:Binance Coin crypto_name:Cardano crypto_name:Tether crypto_name:Solana crypto_name:XRP crypto_name:Polkadot crypto_name:USD Coin crypto_name:Dogecoin crypto_name:Terra crypto_name:Uniswap crypto_name:Wrapped Bitcoin crypto_name:Litecoin crypto_name:Avalanche crypto_name:Binance USD crypto_name:Chainlink crypto_name:Bitcoin Cash crypto_name:Algorand crypto_name:SHIBA INU crypto_name:Polygon crypto_name:Stellar crypto_name:VeChain crypto_name:Internet Computer crypto_name:Cosmos crypto_name:FTX Token crypto_name:Filecoin crypto_name:Axie Infinity crypto_name:Ethereum Classic crypto_name:TRON crypto_name:Bitcoin BEP2 crypto_name:Dai crypto_name:THETA crypto_name:Tezos crypto_name:Fantom crypto_name:Hedera crypto_name:NEAR Protocol crypto_name:Elrond crypto_name:Monero crypto_name:Crypto.com Coin crypto_name:PancakeSwap crypto_name:EOS crypto_name:The Graph crypto_name:Flow crypto_name:Aave crypto_name:Klaytn crypto_name:IOTA crypto_name:eCash crypto_name:Quant crypto_name:Bitcoin SV crypto_name:Neo crypto_name:Kusama crypto_name:UNUS SED LEO crypto_name:Waves crypto_name:Stacks crypto_name:TerraUSD crypto_name:Harmony crypto_name:Maker crypto_name:BitTorrent crypto_name:Celo crypto_name:Helium crypto_name:OMG Network crypto_name:THORChain crypto_name:Dash crypto_name:Amp crypto_name:Zcash crypto_name:Compound crypto_name:Chiliz crypto_name:Arweave crypto_name:Holo crypto_name:Decred crypto_name:NEM crypto_name:Theta Fuel crypto_name:Enjin Coin crypto_name:Revain crypto_name:Huobi Token crypto_name:OKB crypto_name:Decentraland crypto_name:SushiSwap crypto_name:ICON crypto_name:XDC Network crypto_name:Qtum crypto_name:TrueUSD crypto_name:yearn.finance crypto_name:Nexo crypto_name:Celsius crypto_name:Bitcoin Gold crypto_name:Curve DAO Token crypto_name:Mina crypto_name:KuCoin Token crypto_name:Zilliqa crypto_name:Perpetual Protocol crypto_name:Ren crypto_name:dYdX crypto_name:Ravencoin crypto_name:Synthetix crypto_name:renBTC crypto_name:Telcoin crypto_name:Basic Attention Token crypto_name:Horizenput:
Комментарии:
1. Эй, спасибо за помощь, код определенно работает для поиска всех имен для меня. Как бы я мог получить другие данные из этого, например, скажем, цены? Я пытаюсь понять, как получить доступ к этим данным, но мне трудно понять структуру диктантов, которые мы используем в данном случае.
2. Вы можете захватить любые данные, какие захотите . Чтобы получить данные из бэкдора , запрошенный URL-адрес должен быть URL API . Это URL-адрес Api. Перейдите на вкладку сеть gt; XHR/выборка gt;gt; заголовки, затем вы увидите этот URL-адрес, и если вы нажмете на предварительный просмотр, вы также сможете увидеть данные.