在标记为重复之前,请考虑我已经浏览了许多相关的堆栈溢出文章以及网站和文章。我还没有找到解决方法。
此问题是此问题的后续解答,Selenium Webdriver not finding XPATH despite seemingly identical strings。我通过更新代码使其更优雅地工作来确定问题实际上并非来自xpath方法:
for item in feed:
img_div = item.find_element_by_class_name('listing-cover-photo ')
img = WebDriverWait(img_div, 10).until(
EC.visibility_of_element_located((By.TAG_NAME, 'img')))
这适用于前5ish元素。但是,在超时之后,通过获取img_div的内部html并进行打印,我发现对于超时的元素,我想要的不是图像,而是想要的是带有“ lazyload-placeholder”类的div。这使我不得不抓取惰性加载的元素,但是找不到任何答案。如您所见,我正在使用WebDriverWait尝试给它时间加载,但是我还尝试了整个站点范围内的等待调用以及time.sleep调用。等待似乎无法解决问题。我正在寻找最简单的方法来处理这些延迟加载的图像,最好是在Selenium中使用,但是如果我可以将其他库或产品与我已经拥有的Selenium代码一起使用,那将是很好的。任何帮助表示赞赏。
答案 0 :(得分:1)
您的图像只有在滚动到视图中时才会加载。 Selenium Python文档在其FAQ中包含它是一个非常普遍的要求。根据{{3}},以下脚本将在抓取图像之前向下滚动页面。
driver.get("https://www.grailed.com/categories/footwear")
SCROLL_PAUSE_TIME = 0.5
i = 0
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(SCROLL_PAUSE_TIME)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
i += 1
if i == 5:
break
driver.implicitly_wait(10)
shoe_images = driver.find_elements(By.CSS_SELECTOR, 'div.listing-cover-photo img')
print(len(shoe_images))
为了不(永远)永远滚动鞋子,我在5次迭代后添加了一个break
,但是,您可以随意删除i
变量,它将向下滚动在尽可能长的时间内。
this answer可以对仍在加载的所有剩余图像进行追赶。
测试运行产生了82张图像,我确认使用implicit wait高亮显示了82张图像,将其全部刮在了页面上。根据允许加载的图像数量,您会看到不同的数字。