【问题标题】:How to write names and price in ordered format using Selenium and Python如何使用 Selenium 和 Python 以有序格式编写名称和价格
【发布时间】:2021-12-25 20:32:45
【问题描述】:

我正在创建一个删除货币名称和价格的脚本。每当我运行我的脚本时,它都可以正常工作,但问题是它不会以订单格式打印,就像比特币价格是$65,056.71 它会在比特币行中写入另一个硬币价格。

这样,它将随机值写入每一行

这是我的代码:

from selenium import webdriver

driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("https://coinmarketcap.com/")
driver.implicitly_wait(10)

coins = set()
coin_names = driver.find_elements_by_class_name('iworPT')
print(coin_names)

for names in coin_names:
    coins.add(names.text)

    for coins_val in coins:
        print(coins_val)


# coins price
coinsprice = []
get_coin_price = driver.find_elements_by_class_name('cLgOOr')

for price in get_coin_price:
    coinsprice.append(price.text)

    for price_val in coinsprice:
        print(price_val)


with open('coins.txt', 'w') as f:
    for coins_name, prices in zip(coins,coinsprice):
        f.write(coins_name + ": " + prices + "\n")

driver.close()

提前致谢。

【问题讨论】:

  • 请发布最小可重现代码:minimal reproducible example。打印某种格式的东西可以用 f-strings 来完成,但我们不知道你的代码有什么问题或者什么可以正确完成。
  • 你为什么使用硒?它不适用于网络抓取。改用 python3 请求:docs.python-requests.org/en/latest

标签: python selenium xpath list-comprehension webdriverwait


【解决方案1】:

要获取货币名称价格,您可以使用List Comprehension收集货币名称价格 诱导WebDriverWaitvisibility_of_all_elements_located(),您可以使用以下任一Locator Strategies

  • 代码块:

    driver.get("https://coinmarketcap.com/")
    cryptos = [my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@class='cmc-link' and contains(@href, 'currencies')]//p[@color='text' and @font-weight='semibold']")))]
    prices = [my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@class='cmc-link' and contains(@href, 'currencies')]//p[@color='text' and @font-weight='semibold']//following::td[1]//a")))]
    for i,j in zip(cryptos, prices):
        print(f"Name:{i} current price is:{j}")
    driver.quit()
    
  • 控制台输出:

    Name:Bitcoin current price is:$64,446.62
    Name:Ethereum current price is:$4,611.20
    Name:Binance Coin current price is:$646.55
    Name:Tether current price is:$0.9999
    Name:Solana current price is:$235.89
    Name:Cardano current price is:$2.05
    Name:XRP current price is:$1.19
    Name:Polkadot current price is:$46.57
    Name:Dogecoin current price is:$0.263
    Name:USD Coin current price is:$0.9996
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

  • 什么是EC? EC 未定义
  • 查看更新后的答案。添加了导入。
【解决方案2】:

使用下面的代码

import requests
import json
import time
from random import randint
import csv

def parser():
    r = requests.get('https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing?start=1&limit=10000&sortBy=market_cap&sortType=desc&convert=USD&cryptoType=all&tagType=all',
                     headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'})
    json_data = json.loads(r.text)
    i = 2
    for x in json_data['data']['cryptoCurrencyList']:
        try:
            rank = x['cmcRank']
        except:
            rank = None
        try:
            Name = x['name']
        except:
            Name = None
        try:
            Symbol = x['symbol']
        except:
            Symbol = None
        try:
            Market_Cap = x['quotes'][0]['marketCap']
        except:
            Market_Cap = None
        try:
            Price = x['quotes'][0]['price']
        except:
            Price = None
        try:
            Circulating_Supply = x['circulatingSupply']
        except:
            Circulating_Supply = None
        try:
            Volume_24h = x['quotes'][0]['volume24h']
        except:
            Volume_24h = None
        try:
            percentChange1h = str(round(x['quotes'][0]['percentChange1h'],2))+'%'
        except:
            percentChange1h = None
        try:
            percentChange24h = str(round(x['quotes'][0]['percentChange24h'],2))+'%'
        except:
            percentChange24h = None
        try:
            percentChange7d = str(round(x['quotes'][0]['percentChange7d'],2))+'%'
        except:
            percentChange7d = None
        writer.writerow([rank, Name, Symbol, Market_Cap, Price, Circulating_Supply, Volume_24h, percentChange1h, percentChange24h, percentChange7d])

with open('Out.csv','w',newline='',encoding='utf-8')as export:
    writer = csv.writer(export)
    writer.writerow(['Rank', 'Name', 'Symbol', 'Market_Cap', 'Price', 'Circulating_Supply', 'Volume_24h', 'percentChange1h', 'percentChange24h', 'percentChange7d'])
    parser()

【讨论】:

  • 可能对其他可能想要使用请求的人有用
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多