浏览器到达网页底部时无法退出循环

时间:2018-10-16 10:03:46

标签: python python-3.x selenium selenium-webdriver web-scraping

我用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)解决问题,因为我已经成功使用它们。

我需要知道的所有关于如何将条件放入其中的突破。

2 个答案:

答案 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,则在循环中断之外。