[英]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 行,因为默认情况下 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.