【发布时间】: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外壳输出。