2016-11-10 92 views
1

我目前正在循環訪問URL並在訪問/抓取網站時抓取數據。Python如何在「X」秒後超時/中止並繼續循環迭代

有時候,一個網站的加載時間過長,如果沒有錯誤,但不會完全加載,以允許chromedriver/urlopen完成/繼續使用腳本,只是停留在邊緣。

在這種情況下,動態測試元素的存在不起作用,因爲頁面不會完全加載,並且頁面對於固定元素(甚至不是豐富的標籤,如html或h1標籤等)的測試都不相同。

基本上我尋找一個代碼,將繼續下一個迭代循環「X」秒後,如果頁面dosent負荷

目前使用硒(chromedriver)和Beautifulsoup(BS4)。

def get_emails_from_list(links): 
    email=[] 
    for link in links: 
     driver.get(link) 
     html=driver.page_source 
     try: 
      raw = BeautifulSoup(html, 'html.parser').get_text() 
      emails = re.findall(r'[\w\.-][email protected][\w\.-]+', raw) 
      for em in emails: 
       if em not in email: 
        email.append(emails) 
     except: 
      emails = re.findall(r'[\w\.-][email protected][\w\.-]+', str(html)) 
      for em in emails: 
       if em not in email: 
        email.append(emails) 
    try: 
     email2=list(itertools.chain(*email)) 
    except: 
     email2=email 
    return email2 
+0

你嘗試過什麼內幕?人們會幫助,但他們不會爲你寫代碼。 – Marcs

+0

我一直在尋找一個答案,在這一點上手動重新啓動和編輯列表。看了一下threading.timers,它真的適用於這個問題。我正在看信號包,不知道那個。看起來很有希望,但我完全不熟悉它。 –

回答

1

執行此操作的最佳/常規方法是在套接字上設置超時或使用網絡io使用的庫。所以你應該真的考慮這一點。

如果不是,則可以使用線程或信號。這個使用信號。

import signal, time, random 

class TimeoutError (RuntimeError): 
    pass 

def handler (signum, frame): 
    raise TimeoutError() 

signal.signal (signal.SIGALRM, handler) 

for i in range(5): 
    try: 
     signal.alarm (3) 
     time.sleep (random.randint (1,4)) 
     print ('ok', i) 
    except TimeoutError as ex: 
     print ('timeout', i) 

UPDATE:

顯然,這確實在Windows 工作。根據the documentation:在Windows上,只能使用SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGVSIGTERM調用signal()

On Windows, `signal()` can only be called with `SIGABRT`, `SIGFPE`, `SIGILL`, `SIGINT`, `SIGSEGV`, or `SIGTERM`. 
+0

謝謝。需要嘗試測試,但是什麼是參數符號,幀?在def處理程序(signum,frame)中: raise TimeoutError() –

+0

@Avaricious_vulture:在本例中不使用它們。信號處理程序獲取信號編號(本例中爲signal.SIGALRM)和(Python)棧幀。查看[Python文檔](https://docs.python.org/3/library/signal.html#signal.signal)瞭解更多信息。 –

0

的循環,可以等待幾秒鐘,然後打破

import time 
for i in range(5): 
    time.sleep(3) 
    break