使用python3.6在html表中抓取动态数据

时间:2018-07-31 09:39:53

标签: python-3.x html-table beautifulsoup

我是刚从网站上报废的人。我想从此webpage中找到并下载“价格,价格变动,成交量”数据。这些数据在表中,并分散在男高音的标签下。我尝试了以下python代码:

url = 'https://widget.sentryd.com/widget/#/7D5623FD-E378-411E-A354-C93D10583540' ## 网页版地址
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
page = requests.get(url,headers = headers)
soup = BeautifulSoup(page.text,'lxml')
script = soup.find_all('table')

但是我只得到一个空白列表[]。如何找到数据表并从网站中提取数据?非常感谢。


这是我能找到的最接近的解决方案,而不是我想要的数据。

import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://widget.sentryd.com/widget/#/7D5623FD-E378-411E-A354-C93D10583540' 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
page = requests.get(url,headers = headers)
soup = BeautifulSoup(page.content,'html.parser')
tables = pd.read_html(soup.text)
print(tables[0])

结果是一个带有字段名称的数据框,但没有我需要的数据。 请告诉我该怎么做。谢谢

1 个答案:

答案 0 :(得分:1)

使用AJAX使用JavaScript渲染网页。您可以使用API​​来访问数据,就像AJAX请求一样。您将获得一个JSON响应,您可以对其进行解析以获取所需的数据。您可以编辑网址以仅返回所需的货币,例如

url = "https://widget.sentryd.com/widget/api/instruments/latest/EUR_USD?ts=1533035674098"

这是返回所有货币的代码。

import requests
url = "https://widget.sentryd.com/widget/api/instruments/latest/EUR_USD,GBP_USD,USD_JPY,USD_CAD,USD_CHF,AUD_USD,NZD_USD,EUR_GBP,EUR_JPY,EUR_CAD,EUR_CHF,EUR_AUD,GBP_JPY,GBP_CAD,GBP_CHF,GBP_AUD,USD_CNH,XAU_USD?ts=1533035674098"
r = requests.get(url)
j =r.json()
for i in j:
    print (j[i]['instrument'], j[i]['timestamp'],j[i]['bidPrice'],j[i]['offerPrice'],j[i]['currency'])

已更新,以回应评论。

您可以像这样获得其余的原始数据。

import requests
import time

s = requests.Session()
s.headers.update({'Content-Type': 'application/x-www-form-urlencoded',
                  'Accept': 'application/json',
                  'authorization': 'Basic Y3VycmVuY3lfd2lkZ2V0OmN1cnJlbmN5X3dpZGdldA=='
                  })

url = "https://widget.sentryd.com/widget/sentry/api/Pricing"
data = {'Type': 'Pricing',
        'Products': 'EUR/GBP',
        'POSTAccessCode': 'sentryPricingApi',
        'POSTAccessPassword': 'sentrypricingapi_213',
        'timestamp': str(round(time.time() * 1000))}

r = s.post(url, data=data)
print(r.json())

data['Type']= 'Volatilities'
r = s.post(url, data=data)
print(r.json())

文件https://widget.sentryd.com/widget/currency-widget.min.js处理此数据,您可以阅读该文件以获取有关如何解释数据的示例。

如果您不想要原始数据,请使用可呈现JavaScript生成的网页的技术对其进行抓取,请参见我对Scraping Google Finance (BeautifulSoup)的回答