Python - selenium webdriver在循环中停留在.get()

问题描述 投票:7回答:3

我有一个Python代码片段,它使用Selenium Webdriver来循环一些历史性的棒球赔率。代码的第一部分旨在从调度表(包含大约57个需要循环的页面)中获取所有单独的游戏URL,并将它们存储在列表中。

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

使用print()进行一些手动错误检查表明代码的所有其他区域都正常。这个问题可能是什么原因?

编辑1:如上所述,代码实际上在第一次.get()调用之后立即卡住,而不是在第二次调用之前。我还注意到.get()函数在循环访问游戏URL时在代码中运行得很好。由于某种原因,它特别是“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)
python selenium-webdriver
3个回答
5
投票

从今天开始,我遇到了同样的问题。我发现任何运行版本的64.- Chrome的机器都有间歇性悬挂问题,但运行63.-的机器却没有。去chrome://settings/help并查看哪个版本:enter image description here

如果您正在运行该版本。尝试下载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.-,请使用上述内容


1
投票

尝试将驱动程序定义移动到循环中。我有同样的问题,它对我有用。它减慢了一点代码,但至少它有效。


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.