无法成功完成循环滚动

时间:2017-11-04 22:52:25

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

我已经在python中编写了一些与selenium结合使用的代码来从网站上获取一些电话号码。要访问内容,必须在搜索框中输入城市名称,然后点击搜索按钮。我做了相应的“迈阿密”作为城市名称。但是,名称列表会出现连接到每个名称的超链接。如果单击该链接,则会弹出一个信息框。我的脚本可以解析它的电话号码。我面临的问题是,大约有30个名字,但我的脚本只解析一个单一的潜在客户,而不是单击下一个链接,它会中断。如何纠正我的循环以成功滚动并解析所有潜在客户?

这是我正在谈论的链接The Link

这是我到目前为止写的脚本:

from lxml.html import fromstring
from selenium import webdriver;import time
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, 10)
driver.get("put here the above link")
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[name='city']"))).send_keys("Miami")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".btn-primary"))).click()
time.sleep(3)
try:
    for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ajaxBtn"))):
        item.click()
        time.sleep(3)
        root = fromstring(driver.page_source)
        phone = root.cssselect("td:contains('Phone:')+td")[0].text
        print(phone) #prints it and stops rolling
except:pass

driver.quit()

1 个答案:

答案 0 :(得分:1)

您需要在阅读电话号码后关闭弹出窗口,以便找到下一个要点击的元素并打开弹出窗口。还有一个案例有些记录没有电话,需要滚动到下一个项目。

只需更新循环如下:

try:
    for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ajaxBtn"))):
        item.click()
        time.sleep(3)
        root = fromstring(driver.page_source)
        try:
            phone = root.cssselect("td:contains('Phone:')+td")[0].text
        except:
            print("No phone!")
            pass
        print(phone) #prints it and stops rolling
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#popclick > div > div > div.modal-header > button"))).click()
        # find the height of the item by item.location['y'] and scroll to the item
        driver.execute_script("window.scrollTo(0, %d)" %(item.location['y']))
except:pass