【问题标题】:How to scroll a div when ajax is used to load data in python seleniumpython selenium中使用ajax加载数据时如何滚动div
【发布时间】:2015-09-16 21:31:03
【问题描述】:

我正在窗口 8 中使用 chrome webdriver 处理 python selenium。我遇到了一个 page,它在使用 ajax 滚动时加载数据。我尝试注入 jquery,但以下链接对我不起作用。 Link 1Link 2Link 3

谁能给我一条正确的道路。

编辑----------

这是我在alecxe回答后的部分代码

    nam = driver.find_element(By.CLASS_NAME ,'_wu')

    #get length of review
    revcnt = driver.find_element(By.XPATH ,"//span[@class='_Mnc _yz']")
    revcnt = int(revcnt.text.replace(" reviews","").strip())
    print revcnt
    # wait for reviews to appear
    wait = WebDriverWait(driver, 10)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))
    #reviews=[]
    while True:
        reviews = driver.find_elements_by_css_selector("div._ju")
        if len(reviews)<revcnt:
            driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
        else:
            driver.quit()
        print len(reviews)

但是从while循环中转义的问题!

我试过it

【问题讨论】:

    标签: javascript python selenium selenium-webdriver web-scraping


    【解决方案1】:

    在每次迭代时创建一个循环滚动到列表中最后一个“评论”的视图(对我有用):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("https://www.google.com/search?q=a1%20plumbing%20boise&gws_rd=ssl#gws_rd=ssl&lrd=0x54aeff4cb0b24461:0x23720b81e2bed658,1")
    
    # wait for reviews to appear
    wait = WebDriverWait(driver, 10)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))
    
    while True:
        reviews = driver.find_elements_by_css_selector("div._ju")
        driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
    

    注意这里的循环是无限的——你需要弄清楚如何退出循环。例如,您可以计算滚动到视图之前和之后的评论,如果没有加载更多评论,则退出循环。或者,您可以检查是否存在旋转圈。一旦它没有显示在滚动条上 - 这意味着没有更多评论可以加载。

    这是检测没有更多评论要加载的想法之一 - 检查下一次滚动后评论对话框的滚动高度是否没有改变 - 这接近人类检测到的方式:

    dialog = driver.find_element_by_css_selector("div.review-dialog-list")
    last_scroll_height = 0
    
    while True:
        reviews = driver.find_elements_by_css_selector("div._ju")
        driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
    
        # adding artificial delay (don't tell anyone I'm using sleep here)
        time.sleep(1)
    
        # if scroll height has not changed - exit
        scroll_height = driver.execute_script("return arguments[0].scrollHeight;", dialog)
        if scroll_height == last_scroll_height:
            break
        else:
            last_scroll_height = scroll_height
    
    print(len(reviews)) 
    

    我不喜欢这里有time.sleep(),希望你能有更好的想法来解决这个问题。

    【讨论】:

    • 谢谢,你能告诉我如何退出循环,因为评论长度因其他链接而异,因此我不知道长度。
    • 无法摆脱while循环!我正在使用计数器从循环中退出,但徒劳无功....
    • @SAZ 是的,这有点棘手,我已将此问题添加到我的 TODO 列表中。稍后会回复您。谢谢!
    • @alecxe-count 不起作用,因为它不适用于所有 url,例如上面的链接有 124 位评论者(实际上),但 125 位写在网页上。同样,此页面google.com/… 计数正确。我认为最好尝试旋转树的存在,但如何跟踪短暂的元素??
    • @SAZ 更新了一个选项,如果没有加载新评论,则停止滚动。
    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多