我用python与硒结合编写了一个脚本,以解析网页中所有可用的咖啡店名称。该网页已启用了lazyloading方法,因此我可以在每个滚动图中看到40个名称。如果我滚动2次,则可见的名称数为80,依此类推。
该网页中有125个名称。我下面的脚本可以到达该页面的底部,处理所有滚动,但不能中断循环以打印内容。
到目前为止,这是我的脚本:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 4)
driver.get("https://www.yellowpages.ca/search/si/1/coffee/all%20states")
itemlist = []
while True:
for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
if elem.text not in itemlist:
itemlist.append(elem.text)
try:
driver.execute_script("arguments[0].scrollIntoView();",elem)
except Exception:break
for item in itemlist:
print(item)
driver.quit()
该页面的内容不会动态生成,因此我可以仅使用requests
来更改网址的这一部分/si/1/coffee/
的数量来获取所有内容。但是,我想使用硒控制滚动条来获取它们。
后记:我不希望用driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
或for item in range(3): elem.send_keys(Keys.END)
解决问题,因为我已经成功使用它们。
我需要知道的所有关于如何将条件放入其中的突破。
答案 0 :(得分:3)
您可以尝试实现以下条件:如果条目数在超时范围内保持不变,请中断循环:
itemlist = []
while True:
for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
if elem.text not in itemlist:
itemlist.append(elem.text)
current_len = len(driver.find_elements_by_class_name("listing__name--link"))
try:
driver.execute_script("arguments[0].scrollIntoView();",elem)
wait.until(lambda driver: len(driver.find_elements_by_class_name("listing__name--link")) > current_len)
except Exception:break
for item in itemlist:
print(item)
driver.quit()
答案 1 :(得分:0)
在while True
循环内,将布尔变量done
设置为True。每当您将项目添加到列表时,将其设置为false。
如果done = True
,则在循环中断之外。