我是使用selenium进行网络抓取的新手,我正在抓取SeeTicket。我们的刮刀工作原理如下。
现在的问题是,某些事件不包含某些元素,例如此事件: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会花费大量时间来抓取该页面。
我有数千页要刮。应该做些什么来加快这一进程。
谢谢
要使用硒加速卷筒纸刮擦:
您的有效代码块将是:
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)