我正在使用Python进行一些网页抓取,并且在提取表值方面遇到了一些问题。例如,我有兴趣从http://www.etf.com/etfanalytics/etf-finder中抓取ETF值。下面是我试图从中删除值的表的快照。
以下是我在抓取过程中尝试使用的代码。
#Import packages
import pandas as pd
import requests
#Get website url and get request
etf_list = "http://www.etf.com/etfanalytics/etf-finder"
etf_df = pd.read_html(requests.get(etf_list, headers={'User-agent':
'Mozilla/5.0'}).text)
#printing the scraped data to screen
print(etf_df)
# Output the read data into dataframes
for i in range(0,len(etf_df)):
frame[i] = pd.DataFrame(etf_df[i])
print(frame[i])
我有几个问题。
答案 0 :(得分:1)
表格只有20行,因为默认情况下html页面上只有20行。查看页面的源代码,您正在尝试解析。可能有一种可能的解决方案来遍历分页直到结束,但是用JS实现了分页,它没有反映在URL中,所以我不知道如何直接访问表的下一页
看起来有
的请求jQuery.ajax({
url: "http://www.etf.com/etf-finder-funds-api//-aum/0/3000/1",
success: function(data) {
console.log(JSON.parse(data));
}
});
在该页面上,当我尝试加载第二组100行时。但是,如果可能的话,获取对该URL的访问可能会非常棘手。也许对于这个特定的网站你应该使用一些东西,比如C#中的WebBrowser(我不知道它在python中会是什么,但我确信python可以做任何事情)。您将能够模仿浏览器并执行javascript。
编辑:我已尝试在您提供的页面上的控制台中运行下一个JS代码。
AVPlayerView
它记录了所有2166个对象的数组,表示您要查找的表行。亲自尝试看看结果。看起来像请求网址" 0"是一个起始指数" 3000"是一个限制。
但如果您从其他某个域尝试此操作,您将获得403 Forbidden。这是因为他们有一个Referer标头检查。
再次编辑如@stranac所述,很容易设置该标头。只需将其设置为 tf.random_shuffle
即可享受。
答案 1 :(得分:1)
正如亚历克斯所指出的那样,该网站会请求来自http://www.etf.com/etf-finder-funds-api//-aum/0/3000/1
的数据,该数据会检查Referer
标头,看看您是否可以看到它。
然而,亚历克斯说你无法改变标题是错误的
事实上,使用requests
发送自定义标头非常容易:
>>> r = requests.get('http://www.etf.com/etf-finder-funds-api//-aum/0/3000/1', headers={'Referer': 'http://www.etf.com/etfanalytics/etf-finder'})
>>> data = r.json()
>>> len(data)
2166
此时,data
是一个包含您需要的所有数据的字典,pandas
可能有一种简单的方法将其加载到数据框中。