簡體   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