在python中使用ajax(异步加载?)获取数据

时间:2018-04-06 03:34:28

标签: python-3.6

我试图使用python抓取一些财务数据(网址为http://www.etf.com/etfanalytics/etf-finder)。它是2,164个交易所交易基金的清单。我希望在分类标签中获取所有数据。它几乎看起来像嵌入在网页上的excel电子表格。有109个"屏幕"数据的。我有一行代码:

df = pd.read_html(requests.get(url,headers = {' User-Agent':' Mozilla / 5.0'})。text)。这从第一个屏幕获取数据,但是没有从其他108获取数据。我如何从其他108"屏幕中获取数据"?

我已经看到了一些代码,我可以在页面更改时编写循环,但是url中没有任何页面信息,并且当我从一个数据屏幕移动到另一个屏幕时不会改变。

我还没有编写很长时间的代码,抓取这样的数据对我来说是新的。我一直在查找ajax和异步加载,但我需要有人帮我推进正确的方向。

任何帮助将不胜感激。提前谢谢......

这是我的所有代码。在这一点上,我试图抓取我需要的信息并将其放在sqlite表中。

import pandas as pd
import sqlite3 as db
import requests

# create empty list to store our data scraped
data_list = []

url = 'http://www.etf.com/etfanalytics/etf-finder'

df = pd.read_html(requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}).text)
# df holds multiple DataFrames - index [5] is the classification tab.

df[5].columns = ['Ticker', 'Fund Name', 'Asset Class', 'Strategy', 'Region', 'Geography', 'Category', 'Focus', 'Niche', 'Inverse', 'Leveraged', 'ETN', 'Underlying Index', 'Index Provider', 'Selection Criteria', 'Weighting Scheme', 'Active per SEC']

data_list.append(df[5])

# create a "master" data frame which concatenates all the relevant information together
masterFrame = pd.concat(data_list)

# create a connection to our previously created SQLite database
# use the path and name which corresponds to your local database
cnx = db.connect(r'C:\Users\madan\sqlite\etfs.db')
cur = cnx.cursor()

# remove table if already exists and any data it contains
cur.execute('DROP TABLE IF EXISTS etftable;')

# create the table within the database
sql = '''CREATE TABLE etftable ('Ticker' TEXT, 'Fund Name' TEXT, 'Asset Class' TEXT, 'Strategy' TEXT, 'Region' TEXT, 'Geography' TEXT, 'Category' TEXT, 'Focus' TEXT, 'Niche' TEXT, 'Inverse' TEXT, 'Leveraged' TEXT, 'ETN' TEXT, 'Underlying Index' TEXT, 'Index Provider' TEXT, 'Selection Criteria' TEXT, 'Weighting Scheme' TEXT, 'Active per SEC' TEXT)'''

cur.execute(sql)

# append the data
masterFrame.to_sql(name='etftable', con=cnx, if_exists='append', index=False)

cnx.close()

1 个答案:

答案 0 :(得分:0)

对于此特定页面,您只能使用JavaScript进入下一页。检查代码,我发现有一个API端点:

http://www.etf.com/etf-finder-funds-api//-aum/40/20/1

40表示从第40条记录开始,20获取接下来的20条记录,这将返回一个易于解析的JSON记录。

但是,在Chrome中尝试此功能会失败;在您可以访问API之前,可能需要首先设置一堆标头和Cookie,并且可能还有一个Same Origin规则阻止您从外部调用API。

一种可能的解决方案(我根本没有尝试过)是remote control of Chrome来激活JavaScript按钮,也许是intercept the network messages to grab the replies

总结一下:我之前建议的标准刮削工具不起作用;你可能需要进入浏览器的内部并捕获数据传输。

或者只需支付(可能很多)资金来访问商业API!