在抓取网站获取数据后,数据不完整

时间:2018-03-07 08:01:53

标签: python html web-scraping

我正在使用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])

我有几个问题。

  • 表格仅包含20个条目,而网站每个表格的总条目数应为2166个条目。如何修改代码以获取所有值?
  • 从网站抓取后,无法正确分配某些数据框。例如,frame [0]的输出不是数据帧格式,当尝试在Python控制台下查看为DataFrame时,帧[0]没有看到任何内容。但是在打印到屏幕时似乎很好。如果我使用beautifulSoup对HTML进行分阶段会更好吗?

ETF table

2 个答案:

答案 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可能有一种简单的方法将其加载到数据框中。