【问题标题】:Python - selenium webdriver stuck at .get() in a loopPython - selenium webdriver 在循环中卡在 .get()
【发布时间】:2018-02-07 14:47:11
【问题描述】:

我有一个 Python 代码 sn-p,它使用 Selenium Webdriver 循环查看一些历史棒球赔率。代码的第一部分旨在从日程表(由大约 57 个需要循环的页面组成)中获取所有单独的游戏 URL,并将它们存储在一个列表中。

我第一次测试时它工作得很好 - 现在,无论出于何种原因,driver.get() 函数似乎无法正常工作。发生的情况是 webdriver 在 pageRange 循环(第 2 页)中启动了第一个 .get() 方法,但在那之后,在循环的下一次迭代中,它被卡住并且没有导航到第 3 页。没有错误消息或崩溃。

使用 print() 进行的一些手动错误检查表明代码的所有其他区域都运行良好。此问题的潜在原因可能是什么?

编辑 1:代码实际上在第一次 .get() 调用之后立即卡住,而不是在第二次之前卡住,如上所述。我还注意到,当循环通过游戏 URL 时,.get() 函数在代码的后面工作得很好。出于某种原因,它特别是“http://www.oddsportal.com/baseball/usa/mlb-2017/results/#/page/2/”、““http://www.oddsportal.com/baseball/usa/mlb-2017/results/#/page/3/”等,它被卡住了。

season = str(2017)

URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + "/results/#/"
chrome_path = r"C:\Users\dansl110\Dropbox\Betting Project/chromedriver.exe"

OddsList = pd.DataFrame(columns=["Date", "HomeTeam", "AwayTeam", "HomeOdds", 
"AwayOdds", "Accuracy"])

GameURLs = []
StartURL = 2

#Gets GameURLs and EndPage from Page 1
driver = webdriver.Chrome(chrome_path)
driver.get(URL)
elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
    link = elem.get_attribute("href")
    if "/results/#/page/" in link:
        EndURL = int(''.join(c for c in link if c in digits))
    elif "/mlb" in link and len(str(link)) > 58 and "results" not in link:
        GameURLs.append(link)

PageRange = range(StartURL, EndURL - 5)

#Gets remaining GameURLs
for page in PageRange:
    oldURL = URL
    URL = "http://www.oddsportal.com/baseball/usa/mlb-" + season + 
    "/results/#/page/" + str(page) + "/"
    #This .get() works only during the first iteration of the range loop
    driver.get(URL)
    time.sleep(3)
    elems = driver.find_elements_by_xpath("//a[@href]")
    for elem in elems:
        link = elem.get_attribute("href")
        if "/nhl" in link and len(str(link)) > 65 and "results" not in link:
            GameURLs.append(link)

【问题讨论】:

  • 能否包含脚本的调试输出?此外,很高兴看到每次调用 driver.get()URL 以及您找到的每个 link
  • 我已经用输入到 driver.get() 的 URL 更新了描述。命令提示符中没有显示任何形式的错误描述的输出。我在 driver.get() 和 time.sleep(3) 之间放了一个 print("Done") 来查看它是否超过了这个阶段——它没有。它导航到提供给 get() 调用的页面,但这样做后不会继续执行代码。
  • 如果你在第一次调用find_elements_by_xpath()之前和之后尝试print(),你会看到什么?
  • 第一个工作正常,我可以看到之前和之后的打印。对于第二个,什么都没有出现。代码显然没有那么远。
  • 您必须添加更多调试才能确定它到底在哪里停止。例如,尝试在每个 for 循环迭代的开始添加打印。 (您可能只是在循环大量元素。)如果这样做,如果您包含脚本 with 调试语句以及 full、raw外壳输出。

标签: python selenium-webdriver


【解决方案1】:

尝试将您的驱动程序定义移动到循环中。我有同样的问题,它对我有用。它使代码变慢了一点,但至少它可以工作。

【讨论】:

    【解决方案2】:

    您是否尝试过使用driver = webdriver.Firefox()?我相信它更可靠,你甚至可以使用Selenium IDE

    【讨论】:

    • 嗨!请原谅我可能会问一个愚蠢的后续问题,但我不需要像使用 Chrome 驱动程序那样下载 Firefox 驱动程序,然后参考它的路径,以便它工作吗?
    • 我尝试只更改那行代码,结果是错误消息“找不到文件”。
    • 你需要下载GeckoDriver并放入PATH
    【解决方案3】:

    从今天开始我遇到了同样的问题。我发现运行 Chrome 版本 64.- 的任何机器都存在间歇性挂起问题,但运行 63.- 的机器没有。转到chrome://settings/help 并检查哪个版本:

    如果您正在运行该版本。尝试在此处下载 Chromedriver 版本 (2.35):https://sites.google.com/a/chromium.org/chromedriver/downloads

    我试过这个,它似乎对悬挂有一点帮助,但它似乎仍在发生。

    修复它的唯一方法是返回为 Chrome 构建 63.-

    希望对你有帮助。

    编辑:

    我发现this 线程会有所帮助!在创建驱动程序之前将其添加到您的脚本中:

    from selenium import webdriver
    
    ChromeOptions = webdriver.ChromeOptions()
    ChromeOptions.add_argument('--disable-browser-side-navigation')
    driver = webdriver.Chrome('your/path/to/chromedriver.exe', chrome_options=ChromeOptions)
    

    一旦 Chrome 版本65.- 出来,它就会被修复。同时,如果你还在64.-上,请使用上述方法

    【讨论】:

    • 哇!谢谢!太棒了:)
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2022-11-29
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多