2017-07-07 65 views
0

我使用Selenium及其Python綁定來自LinkedIn的Webscrape進行研究項目。我webscrape人的配置文件。Selenium顯式等待LinkedIn旋轉圈

在LinkedIn中,當您加載個人資料時,該網站會放置旋轉圈,直到完成加載體驗和教育。 我希望Selenium等到旋轉的圈子消失,才能在HTML源代碼中獲得體驗和教育部分。

所以我的問題是:如何編寫明確的等待LinkedIn旋轉圈?

編輯:一個更精確的問題是:如何獲得旋轉圈的定位器? 瀏覽器開發工具沒有時間做到這一點。他們消失得太快

編輯2:另一點。一個人可能有也可能沒有教育部分。因此,單擊或以其他方式檢查教育部門是否存在不是解決方案。教育部分可能不存在,因爲沒有教育部分(該人沒有在LinkedIn上提供任何信息,因此沒有在DOM中插入教育部分),或者因爲它尚未加載(有一個旋轉圈)。我想知道它是哪一個。如果這是第二個原因(有一個旋轉的圈子),我想等待。 (該部分是一個名爲education-sectiondiv)。這同樣適用於這個問題

這是用於這個問題的項目的核心。

這些是一個類中的2個函數。 self.getBrowser()返回一個WebDriver對象。爲了清晰和簡潔起見,我已經刪除了不感興趣的部分,包括2個函數內的代碼,所以似乎在現實中沒有使用的參數是。我希望其餘的變數是自我解釋的。

def waitForPresenceCondition(self, by, value, sleep = True, check_for_404 = True): 
    try: 
     condition = EC.visibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 
    except TimeoutException: 
     logging.critical("Timed out waiting for page element. Fatal. Exiting") 
     raise 
    except: 
     logging.error("Unexpected exception waiting for page element. Exiting") 
     raise 
    else: 
     logging.debug("Element found in URL") 

# Scrape an organization 
def scrape(self, url): 
    self.getBrowser().get(url) 
    try: 
     self.waitForPresenceCondition(By.CLASS_NAME, "pv-profile-wrapper") 
    except Error404: 
     logging.info("waitForPresenceCondition raised 404 error. Returning False") 
     return False 
    #INSERT HERE EXPLICIT WAIT FOR THE SPINNING CIRCLES 

回答

2

紡車有類名爲artdeco-spinner

我發現它通過插入一個斷點在Chrome DevTools

關注this引導並插入的「動畫」事件

然後斷點通過@Andersson的建議我用硒invisibility_of_element_located功能,等待locator是要麼不可見或不連接到了DOM。我不需要區分這兩種情況

def waitForInvisibility(self, by, value): 
    condition_str = "(" + str(by) + "," + value + ")" 
    url = self.getBrowserURL() 
    msg = "Waiting for in-visibility of " 
    msg += condition_str 
    msg += " in URL='" + url + "'" 
    logging.info(msg) 
    try: 
     condition = EC.invisibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 
    except TimeoutException: 
     logging.critical("Timed out waiting for element invisibility. Exiting") 
     raise 
    except: 
     logging.error("Unexpected exception waiting for element invisibility. Exiting") 
     raise 
    else: 
     logging.debug("Element " + condition_str + " is now invisible in URL='" + url + "'") 
1

你可以像下面代碼更新:

def waitForPresenceCondition(self, by, value, sleep=True, check_for_404=True, visible=True): 
    try: 
     if visible: 
      condition = EC.visibility_of_element_located((by, value)) 
     else: 
      condition = EC.invisibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 

這應該允許您使用waitForPresenceCondition()visible=False參數等到div紡紗圈dissapear

+0

問題是:如何獲得旋轉圓圈的定位器?瀏覽器刪除工具沒有時間做到這一點。它們消失得太快 – raffamaiden

+0

你可以嘗試在''div'覆蓋的元素上做一個'click()',並且你應該得到像'org.openqa.selenium.WebDriverException:元素不可點擊的點( 411,675)。其他元素會收到點擊:這裏是目標div的HTML。你可以使用異常中的HTML樣本做出選擇 – Andersson

+0

你可以更具體嗎?加載配置文件時,您會看到旋轉的圓圈。過了一段時間後,這些旋轉的圈子會自行消失(所以可能都是通過AJAX處理的)。 「經過一段時間後」變化很大,但僅僅從開發工具中選擇旋轉圓圈並查看它們是否具有某些專有類或ID我不能用作選擇器 – raffamaiden