Chrome Sellenium在循环中几次成功迭代后随机冻结

dm7nw8vv  于 10个月前  发布在  Go
关注(0)|答案(2)|浏览(111)

当我运行循环时,最初的几次迭代(有时5次,有时15次,看起来很随机)工作得很好,但是由于某些原因,程序在某个时候会不确定地挂起

for url in links: 
    driver.get(url)
    print(url)
    li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s")
    price_elements = driver.find_elements(By.CLASS_NAME, "css-t9ee1.er34gjf0")
    #some job on python lists

字符串
这些网站是相似的,看起来像this
我尝试的是:
首先,我受到这个anwser的启发,使用driver.command_executor.set_timeout(10),但它并没有解决这个问题。
我尝试了结构,try & except ''像这样:

for url in links: 
    try:
        driver.get(url)
        print(url)
        li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s")
        price_elements = driver.find_elements(By.CLASS_NAME, "css-t9ee1.er34gjf0")
        #some job on python lists
    except: 
        print("error has occured")
        driver.get(url)
        print(url)
        li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s")
        price_elements = driver.find_elements(By.CLASS_NAME, "css-t9ee1.er34gjf0")
        #some job on python lists


它确实在except块中执行了print函数,但它在driver.get(url)处停止,并吐出关于sellenium的错误,如:

ReadTimeoutError                          Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_16228\257283962.py in <module>
     19     except:
     20         print("error has occured")
---> 21         driver.get(url)
     22         print(url)
     23         li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s")

C:\Users\Public\anacondaa\lib\site-packages\selenium\webdriver\remote\webdriver.py in get(self, url)
    351     def get(self, url: str) -> None:
    352         """Loads a web page in the current browser session."""
--> 353         self.execute(Command.GET, {"url": url})
    354 
    355     @property


重新启动webdriver似乎可以,但是在几次迭代后它仍然停止。因为我有大约900个站点要废弃,这不是一个可行的选择。
我曾想过用类似于li_elements = WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "css-sfcl1s")))的东西来替换标准的li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s"),但问题仍然存在。
有什么办法解决这个问题吗?

cl25kdpy

cl25kdpy1#

我不知道是什么原因导致了你的问题,但如果我不得不猜测的话,我会说要么是错误的URL,要么是chromdriver在完成后没有关闭。尝试杀死现有的示例,看看是否能修复它。

1aaf6o9v

1aaf6o9v2#

我想你可能误解了“try-except”是如何工作的。一旦异常被捕获,你就试图重复导致错误的步骤。在大多数情况下,它不会起作用。

你要做的是:

  • 试图执行一些代码
  • 捕获异常
  • 重新尝试处理“破碎”的URL
  • 失败,因为第二次尝试完成与未处理的异常(线程中断,所以它是你的循环)
    你应该/可能做的事情:
  • 尝试执行一些代码
  • 捕获异常
  • 打印指向导致问题的url的消息(此外还打印异常消息)
    *不要再次尝试处理“损坏”的URL

代替

print("error has occured")
    driver.get(url)
    print(url)
    li_elements = driver.find_elements(By.CLASS_NAME, "css-sfcl1s")
    price_elements = driver.find_elements(By.CLASS_NAME, "css-t9ee1.er34gjf0")
    #some job on python lists

字符串
你应该只留下sth like:

print("error has occured while processing url: ",url)


您也可以打印异常消息,以了解是什么导致错误。

相关问题