使用 Python 在 ESPN 的选秀前策略中重新排序球员

Posted

技术标签:

【中文标题】使用 Python 在 ESPN 的选秀前策略中重新排序球员【英文标题】:Re-order players in ESPN's Pre-Draft Strategy using Python 【发布时间】:2019-12-14 15:26:30 【问题描述】:

我正在尝试使用 Python 和 Selenium 对我的梦幻足球队的选秀前策略页面中的球员进行重新排序。登录并进入页面没问题,但尝试交换玩家会导致一些问题。

到目前为止,我使用了以下代码但没有成功:

import nfl_useful_functions as nfl
from selenium.webdriver import ActionChains
import time

## Login to ESPN
driver = nfl.login2espn()
## Go to draft strategy page
driver.get("http://fantasy.espn.com/football/editdraftstrategy?leagueId=123456")
## Wait 10 seconds
time.sleep(10)
## Choose the player to be dragged (player 1)
draggable = driver.find_element_by_xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[5]/div[2]/div[1]/div[1]/div[2]/div[2]/div[1]/div[2]/section[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[1]")
## Choose the player for player 1 to be dragged onto (and swapped with)
droppable = driver.find_element_by_xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[5]/div[2]/div[1]/div[1]/div[2]/div[2]/div[1]/div[2]/section[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]")
## Drag and drop
#Attempt 1
ActionChains(driver).drag_and_drop(draggable, droppable).perform()
#Attempt 2
ActionChains(driver).drag_and_drop_by_offset(draggable, 0, 40).perform()
#Attempt 3
ActionChains(driver).click_and_hold(draggable)\
                    .move_to_element(droppable)\
                    .release(draggable)\
                    .perform()
#Attempt 4
ActionChains(driver).click_and_hold(draggable)\
                    .move_to_element_with_offset(draggable,0,40)\
                    .release(draggable)\
                    .perform()
## Wait 5 seconds
time.sleep(5)
## Close driver
driver.close()

我已经(单独)尝试了每一种不同的尝试,但唯一(小的)积极因素是我试图移动的玩家确实被选中了:

但实际上没有任何结果。脚本每次都成功运行(我的意思是没有错误)。我试图拖动的播放器变灰,如上所示,持续两三秒钟,然后似乎放弃了,脚本结束了。没有例外或任何东西。

还有什么我可以尝试的吗?理想情况下,它仍然会在 Python 中,除了我非常愿意接受任何建议!根据 Wappalyzer 的说法,如果它有用的话, 相关页面的详细信息是:

编辑

This 是我手动切换玩家时页面的外观。 This 是我运行上述脚本时页面的外观(尝试 1)。

编辑 2

我在 ESPN 上创建了一个一次性帐户,以便更轻松地解决问题。使用 od44@live.co.uk 和 Pa55word123 登录 ESPN Fantasy,然后转到 Pre-Draft Strategy Page。

【问题讨论】:

您好,请提供更多信息。所有代码都工作正常吗(除了它没有做你想要的)?没有错误?它在哪一部分断裂?输出是什么? @simkus 我已经更新了问题,基本上代码没有产生错误,但也不是预期的结果 您能否澄清一下“变灰”行为是否是预期的?您能否使用ScreenToGif 制作一个简短的 gif,说明预期内容以及驱动程序窗口正在做什么? @GezaKerecsenyi 我已经在问题中添加了预期/发生了什么,如果还有什么我可以添加的有用的话,请告诉我 @OD1955 - 谢谢,这些 GIF 非常有帮助!我会看看我是否能想出一个解决方案。 【参考方案1】:

好的,所以我尝试重新创建问题,我注意到它实际上可以更改玩家的位置,但前提是鼠标光标位于另一个玩家上方。 你可以在视频here看到它

我尝试使用无头硒,希望问题不会再次发生,但无头硒也失败了

所以知道问题(除了 selenium)是光标的位置,我使用 pyautogui 将光标移动到我们想要放置播放器的位置:

from time import sleep

import pyautogui
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
# logged in manually

## Choose the player to be dragged (player 1)
draggable = driver.find_element_by_xpath("//div[@title='Rank' and text()=1]")
## Choose the player for player 1 to be dragged onto (and swapped with)
droppable = driver.find_element_by_xpath("//div[@title='Rank' and text()=2]")

pyautogui.moveTo(droppable.location['x'], droppable.location['y'])
sleep(0.1)
ActionChains(driver).drag_and_drop(draggable, droppable).perform()

这个“黑客”对我有用。你可以在视频here看到它是如何工作的

重要提示!

即使这有效(请记住使用没有工具栏的 selenium,因此不需要调整 Y 位置)。这不是完美的解决方案,因为您需要移动光标,在完美的世界中,您可以只使用 drag_and_drop 方法。但是,如果您认为它适用于您的个人项目,我认为您可以选择它

【讨论】:

感谢您的回答!一个问题:如何在没有工具栏的情况下使用 selenium? @OD1995 您可以在 ChromeOptions ``` chrome_options = ChromeOptions() 中添加参数 '--app=google.com' ; chrome_options.add_argument('--app=google.com') ;驱动程序 = webdriver.Chrome(options=chrome_options) ```

以上是关于使用 Python 在 ESPN 的选秀前策略中重新排序球员的主要内容,如果未能解决你的问题,请参考以下文章

python 网络分析类 - 打开ESPN网站并输出大学橄榄球队的排名

tkinter 是不是在 Python 3.9.0b3 中重命名?

如何在 Python 中重命名解压缩的文件?

在 C# / Python 中重命名远程文件服务器上的文件

在Python中重命名目录中的多个文件[重复]

在 Python 中重命名 ZipFile