Selenium明确等待LinkedIn旋转圈子

时间:2017-07-07 19:55:15

标签: python selenium web-scraping linkedin

我正在使用Selenium及其Python绑定到LinkedIn的webscrape进行研究项目。我webscrape人的个人资料。

在LinkedIn中,当您加载个人资料时,该网站会放置旋转圈,直到体验和教育完全加载为止。 我希望Selenium等到旋转圆圈消失,以便在HTML源代码中获得体验和教育部分。

所以我的问题是:我如何编写明确的等待LinkedIn旋转圈?

编辑:一个更精确的问题是:我如何获得旋转圈的定位器? 没有时间从浏览器开发工具那里做到这一点。它们消失得太快

编辑2:另一点。一个人可能有也可能没有教育部分。因此,点击或以其他方式检查教育部分是否存在不是解决方案。教育部门可能不存在,因为没有教育部分(该人没有在LinkedIn上放置任何信息,因此没有在DOM中放置教育部分)或者因为它尚未加载(有一个旋转圈子) )。我想知道它是哪一个。如果这是第二个原因(有旋转圈),我想等。 (该部分是div,其中包含一个名为education-section的类。这同样适用于经验

以下是该问题的核心项目。

这是类中的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 个答案:

答案 0 :(得分:2)

纺车有一个名为artdeco-spinner

的类

我通过在Chrome DevTools

中插入断点找到了它

关注this指南并在“动画”事件中插入断点

然后根据@Andersson的建议,我使用了Selenium 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 :(得分: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旋转圆圈消失