首页 > 解决方案 > 这是功能还是错误?Windows 10 python time.sleep() 挂起时时钟翻转到午夜

问题描述

蟒蛇 3.6.7

我有一个带有 while 循环的 selenium刮板脚本,用于测试要更新的页面内容。如果页面未更改,则初始休眠 5 秒,然后休眠 1 秒。我经常发现这个脚本停止运行,最后一次输出到文件的数据是在午夜之前。我必须通过按 ctrl-C 来终止脚本,它始终time.sleep()是出现在回溯中的脚本之一。每页列出 12 个项目,然后通过脚本单击“下一步”按钮加载下一页。如果少于 12 个项目或没有“下一步”按钮,则它已到达列表的末尾并重新开始。

import time

many lines of page load and site login code

n = 0 #page counter
nx = True
bait_ids = ['dummy']
old_ids = ['dummy']

tg = True
while tg:
    while nx:
        n = n + 1
        time.sleep(5)
        # Selenium hands the page source to Beautiful Soup
        while (list_ids == old_ids):
            time.sleep(1)
            soup_page = BeautifulSoup(driver.page_source, 'lxml')
            list_ids = soup_page.find_all("div", {"class": "dec"})
            
        old_ids = list_ids
        print(len(list_ids)," ", end="")
        ....
        scrape 10 data attributes for each list_ids
        append list_ids and data to text file
        ....
        if (len(list_ids) != 12):
            nx = False
    
        if nx:
            try:
                next_btn = driver.find_element_by_css_selector('a.next')
                next_btn.click()
            except NoSuchElementException:
                if nx:
                    nx = False

来自 ctrl-C 的示例回溯,它有 12 个 list_ids,然后在time.sleep(1).

12  Traceback (most recent call last):
  File "lf7.py", line 265, in <module
    time.sleep(1)
KeyboardInterrupt

标签: pythonwindows

解决方案


考虑到这个错误不是由time模块引起的。您已经在使用time.sleep(5)上面的代码,并且您的代码不会在其中停滞不前。

但是,似乎是问题所在的行在while语句中:

while (list_ids == old_ids):
    time.sleep(1)
    soup_page = BeautifulSoup(driver.page_source, 'lxml')
    list_ids = soup_page.find_all("div", {"class": "dec"})

如果始终满足此循环的条件,则通常停止它会使它看起来像是睡眠问题,而在执行退出循环的条件时更有可能出现问题。

抓取网站时可能出现其他问题,使其停滞不前。没有足够的关于被抓取网站的信息,但是如果你正在抓取第三方的网站,他们可能会阻止你抓取它们,因为所有这些代码都在多个 while 循环中,并且不断的 selenium 请求可能看起来像垃圾邮件。


推荐阅读