[英]Convert dynamically loaded table into Pandas Dataframe
在Windows設備上運行Python 3.6.1 | Anaconda 4.4.0(64位)。
使用硒我收集以下html源:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = "https://nextgenstats.nfl.com/stats/receiving#yards"
driver = webdriver.Chrome(executable_path=r"C:/Program Files (x86)/Google/Chrome/chromedriver.exe")
driver.get(url)
htmlSource = driver.page_source
如果檢查URL,他們將看到一個動態加載的漂亮表。 我不確定如何從htmlsource
提取此表,以便可以從中構造Pandas數據htmlsource
。
你很親密 您只需要在這里幫助熊貓。 簡而言之,這就是您需要做的事情。
BeautifulSoup
soup.find
pd.read_html
from bs4 import BeautifulSoup
soup = BeautifulSoup(htmlSource, 'html.parser')
table = soup.find('div', class_='ngs-data-table')
df_list = pd.read_html(table.prettify())
現在, df_list
包含該頁面上所有表的列表-
df_list[1].head()
0 1 2 3 4 5 6 7 8 9 10 11
0 Antonio Brown PIT WR 4.3 2.6 13.7 45.32 99 160 61.88 1509 9
1 DeAndre Hopkins HOU WR 4.6 2.1 13.1 42.19 88 155 56.77 1232 11
2 Adam Thielen MIN WR 5.8 2.6 11.0 37.38 80 124 64.52 1161 4
3 Julio Jones ATL WR 5.2 2.4 14.2 43.34 73 118 61.86 1161 3
4 Keenan Allen LAC WR 5.4 2.6 9.5 31.30 83 129 64.34 1143 5
作為Scrapy用戶,我習慣查看XHR請求。 如果您更改站點的年份,則會看到對https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG的API調用
該API返回JSON,因此對數據使用read_json
之類的JSON解析器是read_json
的。
這是使用Scrapy shell的方法:
$ scrapy shell
In [1]: fetch("https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG")
2017-12-15 13:11:30 [scrapy.core.engine] INFO: Spider opened
2017-12-15 13:11:31 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG> (referer: None)
In [2]: import pandas as pd
In [3]: data = pd.read_json(response.body)
In [4]: data.keys()
Out[4]: Index([u'season', u'seasonType', u'stats', u'threshold'], dtype='object')
In [5]: pd.DataFrame(list(data['stats']))
如果您沒有草率,可以使用requests
import requests
import pandas as pd
url = "https://appapi.ngs.nfl.com/statboard/receiving?season=2017&seasonType=REG"
response = requests.get(url)
data = pd.read_json(response.text)
df = pd.DataFrame(list(data['stats']))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.