如何使用selenium/python为线性回归创建web scape表数据?

如何使用selenium/python为线性回归创建web scape表数据?,python,selenium,web-scraping,linear-regression,Python,Selenium,Web Scraping,Linear Regression,以下是我的代码,用于刮表: from selenium import webdriver driver=webdriver.Chrome(executable_path="C:\\Users\\Administrator\\Downloads\\chromedriver_win32\\chromedriver.exe") driver.get("https://www.baseball-reference.com/leagues/MLB/2019-standard-pitchi

以下是我的代码,用于刮表:

from selenium import webdriver 
    driver=webdriver.Chrome(executable_path="C:\\Users\\Administrator\\Downloads\\chromedriver_win32\\chromedriver.exe")
    driver.get("https://www.baseball-reference.com/leagues/MLB/2019-standard-pitching.shtml")

    table = driver.find_element_by_xpath('//*[@id="all_players_standard_pitching"]/div[3]').text
    print(table)

    driver.close()
我想解析球员的名字,他们的胜利总数和三振总数(名字,W,SO)

我想用这些信息来做一个线性回归,找出三振对投手胜利的影响程度

我的回归是Wins=B0+SO(X)

我以前从未使用Python运行过回归。任何帮助都将不胜感激。提前感谢!=)
此外,如果不是太麻烦的话,也可以用图形表示数据

要从表中获取玩家的名字,我将使用XPath查找元素列表,然后自己处理该列表

下面是XPath:

//表[@id='players\u standard\u pitching\u clone']//td[@data stat='player']

这将为您提供所有玩家的列表

要使用它,您需要调用
findElements
,以便获得一个列表

driver.findElements(by.XPath(//table[@id='players\u standard\u pitching\u clone']//td[@data stat='player']);

现在您有了一个WebElements列表,其文本包含名称。如果要将名称放入列表,可以执行以下操作:

List<IWebElement> playerNameElements = driver.findElements(by.XPath("//table[@id='players_standard_pitching_clone']//td[@data-stat='player']");
List<string> playerNames = new List<string>();

foreach (IWebElement playerElement in playerElements)
{
    playerNames.Add(playerElement.Text);
}
List playerNameElements=driver.findElements(by.XPath(//table[@id='players\u standard\u pitching\u clone']//td[@data stat='player']);
List PLAYERNAME=新列表();
foreach(playerElement中的IWebElement playerElement)
{
添加(playerElement.Text);
}

现在,
playerNames
将包含一个字符串列表,其中包含表中所有玩家的名字。

要从表中获取玩家的名字,我将使用XPath查找元素列表,然后自己处理该列表

下面是XPath:

//表[@id='players\u standard\u pitching\u clone']//td[@data stat='player']

这将为您提供所有玩家的列表

要使用它,您需要调用
findElements
,以便获得一个列表

driver.findElements(by.XPath(//table[@id='players\u standard\u pitching\u clone']//td[@data stat='player']);

现在您有了一个WebElements列表,其文本包含名称。如果要将名称放入列表,可以执行以下操作:

List<IWebElement> playerNameElements = driver.findElements(by.XPath("//table[@id='players_standard_pitching_clone']//td[@data-stat='player']");
List<string> playerNames = new List<string>();

foreach (IWebElement playerElement in playerElements)
{
    playerNames.Add(playerElement.Text);
}
List playerNameElements=driver.findElements(by.XPath(//table[@id='players\u standard\u pitching\u clone']//td[@data stat='player']);
List PLAYERNAME=新列表();
foreach(playerElement中的IWebElement playerElement)
{
添加(playerElement.Text);
}

现在,
playerNames
将包含一个包含表中所有玩家姓名的字符串列表。

只是快速浏览了一下网站,您不需要整个浏览器/
Selenium
来获取数据。
requests
包对于此类数据更容易/更快:

import requests

url = 'https://www.baseball-reference.com/leagues/MLB/2019-standard-pitching.shtml'
res = requests.get(url)

# make sure we didn't get an error
res.raise_for_status()
然后,我们可以使用解析HTML:

from lxml import html
from lxml.cssselect import CSSSelector
from io import StringIO

doc = html.fromstring(res.content)
comment = doc.xpath(CSSSelector('div.placeholder').path)[0].getnext()
[table] = html.parse(StringIO(comment.text)).findall('//table')
这有点复杂,因为它们将数据/表嵌入到注释中

现在我们已经完成了,我们可以提取数据:

results = []

for i, row in enumerate(table.xpath('//tbody//tr')):
    if 'thead' in row.get('class', ''):
        continue
    player = {}
    for cell in row.xpath('th | td'):
        key = cell.get('data-stat')
        player[key] = cell.text_content()
        columns.add(key)
    results.append(player)
将在
结果
中留下约1000名玩家,并以良好的形式放入
熊猫
的“数据框”中,以便于处理:

import numpy as np
import pandas as pd

df = pd.DataFrame(results)
df.set_index('ranker', inplace=True)

# convert these columns from text to numbers
for name in ('W', 'L', 'SO'):
    df[name] = df[name].astype('float')
一旦你完成了这项工作,可能值得将其保存为CSV文件(或类似文件),你可以稍后重新加载,以防网站发生变化,并且你无法运行上述代码。CSV很好,因为很多工具都可以处理该格式,这将在以后为你提供更多的选项,例如

我发现该软件包目前具有进行线性回归的最佳界面,您可以通过执行以下操作来解决您的问题:

import statsmodels.formula.api as smf

fit = smf.ols('W ~ SO', df).fit()
print(fit.summary())
这将为您提供一个很好的系数摘要。不过,我不鼓励使用这样的模型,您可能希望使用
matplotlib
之类的工具对数据进行大量绘图,可能通过
seaborn


希望有帮助!

只是快速浏览了一下网站,您不需要整个浏览器/
Selenium
来获取数据。
请求
包对于此类数据来说更容易/更快:

import requests

url = 'https://www.baseball-reference.com/leagues/MLB/2019-standard-pitching.shtml'
res = requests.get(url)

# make sure we didn't get an error
res.raise_for_status()
然后,我们可以使用解析HTML:

from lxml import html
from lxml.cssselect import CSSSelector
from io import StringIO

doc = html.fromstring(res.content)
comment = doc.xpath(CSSSelector('div.placeholder').path)[0].getnext()
[table] = html.parse(StringIO(comment.text)).findall('//table')
这有点复杂,因为它们将数据/表嵌入到注释中

现在我们已经完成了,我们可以提取数据:

results = []

for i, row in enumerate(table.xpath('//tbody//tr')):
    if 'thead' in row.get('class', ''):
        continue
    player = {}
    for cell in row.xpath('th | td'):
        key = cell.get('data-stat')
        player[key] = cell.text_content()
        columns.add(key)
    results.append(player)
将在
结果
中留下约1000名玩家,并以良好的形式放入
熊猫
的“数据框”中,以便于处理:

import numpy as np
import pandas as pd

df = pd.DataFrame(results)
df.set_index('ranker', inplace=True)

# convert these columns from text to numbers
for name in ('W', 'L', 'SO'):
    df[name] = df[name].astype('float')
一旦你完成了这项工作,可能值得将其保存为CSV文件(或类似文件),你可以稍后重新加载,以防网站发生变化,并且你无法运行上述代码。CSV很好,因为很多工具都可以处理该格式,这将在以后为你提供更多的选项,例如

我发现该软件包目前具有进行线性回归的最佳界面,您可以通过执行以下操作来解决您的问题:

import statsmodels.formula.api as smf

fit = smf.ols('W ~ SO', df).fit()
print(fit.summary())
这将为您提供一个很好的系数摘要。不过,我不鼓励使用这样的模型,您可能希望使用
matplotlib
之类的工具对数据进行大量绘图,可能通过
seaborn


希望有帮助!

请一次只回答一个问题,并解释当前代码中有什么不起作用。请说明预期的输出以及您为尝试回答问题而进行的研究。这将使我们更容易帮助您。@QHarr发布的代码似乎是web上的研究略过问题的一部分。@JamesPhillips这是一个建议。如果这个问题只针对这一部分,那么可能会更清楚。后续问题可以解决回归问题。@QHarr你的建议很好,我很抱歉。我完全同意你的意见。你真的在乎经常这样做吗?也就是说,为什么不使用“Get table as CSV”选项,这将为您提供一些您可以传递给
pandas
的内容。请一次只回答一个问题,并解释哪些内容与当前代码不符。请指出预期的输出以及您进行了哪些研究