代码之家  ›  专栏  ›  技术社区  ›  venkat

如何在Python Selenium中逐步向下滚动

  •  3
  • venkat  · 技术社区  · 7 年前

    嗨,伙计们,我对Selenium和Python是新手。我只是在清理网站 pagalguy website . 我知道如何向下滚动到页面底部,但我需要的是一步一步地向下滚动,以便Selenium可以单击所有readmore按钮,但我不知道如何像这样一步一步地向下滚动,所以我硬编码如下

    browser.execute_script("window.scrollTo(0,300);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(300,600);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(600,900);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(900,1200);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(1200,1500);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(1500,1800);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(1800,2100);")
    browser.find_element_by_link_text("Read More...").click()
    
    browser.execute_script("window.scrollTo(2100,2500);")
    browser.find_element_by_link_text("Read More...").click()
    it goes on .......
    

    我尝试使用while循环来自动化它,但它导致了错误,上面的一个可行,但我希望它简短且循环,以便我可以将其用于具有不同页面长度的所有其他页面。

    initial_value = 0
    next_value = 300
    while next_value<300000: 
      browser.execute_script("window.scrollTo(initial_value,next_value);")
      browser.find_element_by_link_text("Read More...").click()
      initial_value=next_value
      next_value+=300
    

    JavascriptException:消息:ReferenceError:initial\u值不是 定义

    但是我已经定义了这个值,我想我已经解释了我实际上要做的事情,我想自动向下滚动并单击所有readmore按钮,然后我将获得全文内容

    4 回复  |  直到 7 年前
        1
  •  7
  •   Chanda Korat Ankit Makadiya    7 年前

    同意@Rahul Chawla的回答。

    但增加了一个变化。你可以试试这个

    driver = webdriver.Chrome()
    
    read_mores = driver.find_elements_by_xpath('//a[text()="Read More..."]')
    
    for read_more in read_mores:
        driver.execute_script("arguments[0].scrollIntoView();", read_more)
        driver.execute_script("$(arguments[0]).click();", read_more)
    
        2
  •  1
  •   Rahul Chawla cbiqih    7 年前

    我们可以使用 find_elements_by_xpath() 并在其上循环,同时将其逐个滚动到视图中。

    driver = webdriver.Chrome()
    
    read_mores = driver.find_elements_by_xpath('//a[text()="Read More..."]')
    
    for read_more in read_mores:
        driver.execute_script("arguments[0].scrollIntoView();", read_more)
        read_more.click()
        # your code here
    
        3
  •  1
  •   Mindaugas Vaitkus    6 年前

    在javascript窗口中使用循环。scrollBy(0,Y)方法,坐标选择移动步骤和迭代次数。

       for i in range(20): # adjust integer value for need
           # you can change right side number for scroll convenience or destination 
           driver.execute_script("window.scrollBy(0, 250)")
           # you can change time integer to float or remove
           time.sleep(1)
    
        4
  •  -1
  •   Nic3500 tpdi    6 年前

    尝试以下操作:

    while next_value<300000:
        driver.execute_script("window.scrollTo({},{});".format(initial_value, next_value))
        browser.find_element_by_link_text("Read More...").click()
        initial_value=next_value
        next_value+=300
    

    基本上我只是改变了这一行: 浏览器执行\u脚本(“window.scrollTo(initial\u value,next\u value);”)

    对于这个:

    driver.execute_script("window.scrollTo({},{});".format(initial_value, next_value))