Хотите очистить таблицу на странице с помощью selenium

#python #selenium #web-scraping

#python #selenium #веб-очистка

Вопрос:

Я хочу очистить таблицу на странице в dataframe с названием столбцов «Контракты» и «Ставка финансирования».(https://www.binance.com/en/futures/funding-history/1 )

Это то, что я пробовал до сих пор, но все еще не получается. Буду признателен, если кто-нибудь сможет мне в этом помочь.

 import time

import pandas as pd

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()

options.headless = True
driver = webdriver.Chrome(options=options)

driver.get("https://www.binance.com/cn/futures/funding-history/0")
time.sleep(5)
# headers = driver.find_elements_by_xpath('//*[@class="tablesorter-headerRow"][2]/th/div')
table = driver.find_element_by_xpath('//*[@id="bnc-table-tbody"]')
  

Но он вернул мне некоторые ошибки.

Комментарии:

1. Привет @CHOINCE1001 было бы неплохо, если бы вы также рассказали нам, какие ошибки были.

2. Вы можете получить все данные одним вызовом post. Если вы посмотрите на сеть, вы увидите, что они получают данные из API. Смотрите мой ответ ниже

Ответ №1:

Селектор XPath должен быть: //*[@class="bnc-table-tbody"]

HTML:

пример html

Затем вы можете выполнить итерацию строк таблицы и преобразовать в DataFrame :

 table = driver.find_element_by_xpath('//*[@class="bnc-table-tbody"]')
data = []
for tr in table.find_elements_by_xpath('tr'):
    columns = tr.find_elements_by_xpath('td')
    data.append({
        'Contract': columns[0].text,
        'Funding Rate': columns[2].text
    })
# Convert lits of dictionaries into a dataframe
df = pd.DataFrame(data)
  

Комментарии:

1. Спасибо за ваш ответ. Это отлично решает мою проблему!

Ответ №2:

Наблюдая за сетевыми действиями в инструментах разработчика ( Ctrl Shift I ), кажется, что веб-страница отправляет POST запросы к API, который возвращает JSON данные, используемые для заполнения таблицы. Это означает, что вам не нужно selenium , requests вы сами можете справиться с этой задачей. Мы можем получить все данные одним вызовом post:

 import requests
import pandas as pd

API_URI = ' https://www.binance.com/gateway-api/v1/public/future/common/get-funding-rate-history'

with requests.Session() as session:
    session.headers.update({'User-Agent':'Just Another Human'})
    payload = {'symbol': "BTCUSDT", 'page': 1, 'rows': 1276} # There are 1276 rows
    
    response = session.post(API_URI, json=payload)
   

data = response.json()
df = pd.DataFrame(data['data'])
  

Сетьвведите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ. Я попробовал ваш метод. Но в столбце символов указано то же имя, что и «BTCUSDT», вместо разных имен символов. Есть ли какие-либо способы это исправить?

2. Можете ли вы вставить ожидаемые результаты в виде фиктивных данных из трех строк?

Ответ №3:

доступ tr td к элементам с помощью цикла

 (//div[@class='bnc-table-wrapper']//table//tbody/tr)[index]//td//text()

#this will give the text of td elements try this an loop tr elements