繁体   English   中英

抓取网站数据后数据不完整

[英]Incomplete data after scraping a website for Data

我正在使用 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 时,frame[0] 没有看到任何内容。 然而,打印到屏幕上时似乎很好。 如果我使用 beautifulSoup 来分阶段 HTML 会更好吗?

ETF表

您只能获得表格的 20 行,因为默认情况下 html 页面上只有 20 行。 查看页面的源代码,您正在尝试解析。 可能有一个可能的解决方案来遍历分页直到最后,但是那里的分页是用 JS 实现的,它没有反映在 URL 中,所以我不知道如何直接访问表的下一页。

看起来有一个请求

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

在该页面上,当我尝试加载第二组 100 行时。 但如果可能的话,访问该 URL 可能会非常棘手。 也许对于这个特定的站点,你应该使用一些东西,比如 C# 中的 WebBrowser(我不知道它在 python 中会是什么,但我确信 python 可以做任何事情)。 您将能够模仿浏览器并执行 javascript。

编辑:我尝试在您提供的页面上的控制台中运行下一个 JS 代码。

jQuery.ajax({
  url: "http://www.etf.com/etf-finder-funds-api//-aum/0/3000/1", 
  success: function(data) {
    console.log(JSON.parse(data));
  }
});

它记录了所有 2166 个对象的数组,代表您正在寻找的表行。 自己试试看效果。 看起来在请求 url 中,“0”是一个开始索引,而“3000”是一个限制。

但是,如果您从其他域尝试此操作,则会收到 403 Forbidden。 这是因为他们有一个 Referer 标头检查。

正如@stranac 所提到的,再次编辑很容易设置该标题。 只需将其设置为http://www.etf.com/etfanalytics/etf-finder并享受。

正如 Alex 所指出的,该网站从http://www.etf.com/etf-finder-funds-api//-aum/0/3000/1请求数据,它会检查Referer标头以查看您是否允许看到它。

但是,Alex 说您无法更改标题是错误的。
实际上,使用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是一个包含你需要的所有data的字典, pandas可能有一种简单的方法将它加载到数据帧中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM