[英]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.