#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:
Затем вы можете выполнить итерацию строк таблицы и преобразовать в 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