Python 用于刮桌子的BeautifulSoup和Gadget选择器

Python 用于刮桌子的BeautifulSoup和Gadget选择器,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正在拼命地尝试刮取此表:,但不幸的是,通过运行以下代码: from bs4 import BeautifulSoup import requests url = "https://futures.huobi.com/en-us/linear_swap/info/realtime_fee/" res = requests.get(url) soup = BeautifulSoup(res.text) soup 我没看见桌子上有汤。 我相信这是因为数据不是静态的,是用Java

我正在拼命地尝试刮取此表:,但不幸的是,通过运行以下代码:

from bs4 import BeautifulSoup
import requests
url = "https://futures.huobi.com/en-us/linear_swap/info/realtime_fee/"
res = requests.get(url)
soup = BeautifulSoup(res.text)
soup
我没看见桌子上有汤。 我相信这是因为数据不是静态的,是用Javascript获取的


删除此类表的一般解决方案是什么?

数据是从另一个端点动态提取的。您可以简化该请求,然后执行一些操作以生成类似的输出。熊猫专家可能会找到明显的改善方法。我不得不查找一些东西,并在代码顶部包含了引用

页面上的两个字段与我执行下面的调用时返回的字段之间存在细微差异

# np.r_ https://stackoverflow.com/a/41256772 @piRSquared
# applymap https://stackoverflow.com/a/48792783 @RK1

import requests
import pandas as pd
import numpy as np

headers = {'source': 'web', 'user-agent': 'Mozilla/5.0'}
data = {"contract_code":"","sortName":"","sortDirection":""}

r = requests.post('https://futures.huobi.com/linear-swap-order/x/v1/linear_swap_all_funding_rate', headers=headers, json =data)
result = r.json()['data']

df = pd.DataFrame(result)

df.loc[:,np.r_[list(df.columns[1:3]) + list(df.columns[4:])]] = \
df.loc[:,np.r_[list(df.columns[1:3]) + list(df.columns[4:])]].apply(pd.to_numeric, errors='coerce')
df.loc[:,np.r_[list(df.columns[1:3]) + list(df.columns[4:5])]] = df.loc[:,np.r_[list(df.columns[1:3]) + list(df.columns[4:5])]].applymap("{:,.6%}".format) # 
df.iloc[:, 5:9 ] = df.iloc[:, 5:9 ].applymap("{:,.2%}".format)

df['Funding Rate Limit'] = df['min_funding_limit'] +  ' ~ ' + df['max_funding_limit']
df['Premium Deviation Limit'] = df['min_premium_limit'] +  ' ~ ' + df['max_premium_limit']

df.drop(df.columns[5:9],axis=1,inplace=True)

df.rename(columns={'instrument_id':'Contracts',
                    'premium_index':'Premium Index', 
                    'forecast_fundrate':'Funding Rate',
                    'settlement_datetime':'Current-period Funding settlement time',
                    'realtime_forecast_fundrate':'Estimated Rate'
                   }, inplace = True)
cols = ['Contracts', 'Funding Rate','Current-period Funding settlement time', 'Estimated Rate', 
        'Premium Index', 'Funding Rate Limit', 'Premium Deviation Limit']
df = df[cols]
print(df.head())

如果你能利用熊猫,那就开始吧。太棒了!我只保留了解决方案的第一部分。我没有看到这些数据来自API。在哪里可以找到它?通过F12开发工具在浏览器的“网络”选项卡中。在该选项卡中,按F5刷新页面,然后观察xhr web流量。