提问者:小点点

加速用硒刮网


我是使用selenium进行网络抓取的新手,我正在抓取SeeTicket。我们的刮刀工作原理如下。

    < li >登录 < li >搜索事件 < li >单击每个事件 < li >收集数据 回来吧 < li >单击下一个事件 < li >重复

现在的问题是,某些事件不包含某些元素,例如此事件:https://wl.seetickets.us/event/Beta-Hi-Fi/484490?afflky=WorldCafeLive

其中不包含定价表,但此表包含

https://www.seetickets.us/event/Wake-Up-Daisy-1100AM/477633

所以我使用了尝试,除了块

try:
   find element 
except:
   return none

但是如果它在try中没有找到元素,则需要5秒才能转到,除非因为我使用了

webdriver.implicitwait(5)

现在,如果任何页面不包含多个元素,selenium会花费大量时间来抓取该页面。

我有数千页要刮。应该做些什么来加快这一进程。

谢谢


共3个答案

匿名用户

要使用硒加速卷筒纸刮擦:

  • 完全去掉隐等待()。
  • 针对以下任一元素状态,诱导WebDriver等待将webDrive实例与WebBrowser实例同步:
    • presence_of_element_located()
    • visibility_of_element_located()
    • element_to_be_clickable()

    您的有效代码块将是:

    try:
       element = WebDriverWait(driver, 3).until(EC.visibility_of_element_located((By.ID, "input")))) 
       print("Element is visible")
    except TimeoutException:
       print("Element is not visible")
    

    注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

匿名用户

尝试使用显式等待,而不是隐式等待,而是将其应用于搜索主容器以等待内容加载。对于所有内部元素,应用find_element,无需等待。

附言:分享你的真实代码而不是伪代码总是更好的。

匿名用户

而不是使用 implicitWait 并等待每个单独的元素,只需等待满页加载,例如等待 h1 标记,这将指示已加载整个页面,然后继续提取。

#wait for page load
try:
    pageLoadCheck=WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "(//h1)[1]"))).get_attribute("textContent").strip()

#extract data without any wait once the page is loaded
   try:
       dataOne=driver.find_element_by_xpath("((//h1/following-sibling::div)[1]//a[contains(@href,'tel:')])[1]").get_attribute("textContent").strip()
   except:
        dataOne=''

except Exception as e:
    print(e)