Python Selenium在I';我正试图解析网站上的下一页(以及之后的第七页)。有办法解决这个问题吗?

Python Selenium在I';我正试图解析网站上的下一页(以及之后的第七页)。有办法解决这个问题吗?,python,selenium,css-selectors,webdriverwait,js-scrollintoview,Python,Selenium,Css Selectors,Webdriverwait,Js Scrollintoview,我想解析大约8页的IMDb电影评级。为了做到这一点,我正在使用Selenium,而且我在点击时遇到了问题,正在继续下一页的算法。最后,当我继续使用BeautifulSoup时,我需要1000个标题。下面的代码不起作用,我需要在此HTML中使用“下一步”按钮: <a class="flat-button lister-page-next next-page" href="/list/ls000004717/?page=2"> Next </

我想解析大约8页的IMDb电影评级。为了做到这一点,我正在使用Selenium,而且我在点击时遇到了问题,正在继续下一页的算法。最后,当我继续使用BeautifulSoup时,我需要1000个标题。下面的代码不起作用,我需要在此HTML中使用“下一步”按钮:

<a class="flat-button lister-page-next next-page" href="/list/ls000004717/?page=2">
            Next
        </a>
错误如下:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".flat-button lister-page-next next-page"}
  (Session info: chrome=78.0.3904.108)

我想我缺乏所需的语法知识,或者我把它弄混了一点。虽然每个例子都很独特,而且我不具备充分推断这些案例的知识,但我还是试着继续搜索。Selenium有什么办法可以解决这个问题吗?

您可以尝试使用部分css选择器


浏览器。通过css\u选择器(“a[class*='next-page']”查找元素。单击()

您可以尝试使用XPath查询按钮内的
下一个
文本。您可能还应该调用
WebDriverWait
,因为您正在跨多个页面导航,然后滚动到视图中,因为它位于页面底部:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from time import sleep


browser = wb.Chrome()
browser.get('https://www.imdb.com/list/ls000004717/')

# keep clicking next until we reach the end
for i in range(0,9):

    # wait up to 10s before locating next button
    try:    
        next_button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@class, 'page') and contains(text(), 'Next')]")))

        # scroll down to button using Javascript
        browser.execute_script("arguments[0].scrollIntoView(true);", next_button)

        # click the button
    #    next_button.click() this throws exception -- replace with JS click
        browser.execute_script("arguments[0].click();", next_button)

        # I never recommend using sleep like this, but WebDriverWait is not waiting on next button to fully load, so it goes stale.
        sleep(5)

    # case: next button no longer exists, we have reached the end
    except TimeoutException:
        break
我还将所有内容包装在一个
try
/
块中,除了TimeoutException
块,以处理我们已经到达页面末尾,并且
Next
按钮不再存在的情况,从而打破了循环。这对我来说是多页的


我还必须添加一个显式的
sleep(5)
,因为即使在
element\u上调用
WebDriverWait
使其可点击
next\u按钮
仍在抛出
StaleElementReferenceException
。似乎
WebDriverWait
是在页面完全加载之前完成的,导致
next_按钮的状态在找到后发生更改。通常添加
sleep(5)
是不好的做法,但这里似乎没有其他解决方法。如果其他人对此有任何建议,请随意评论/编辑答案。

有几种方法可以奏效: 1.为“下一步”按钮和循环使用选择器,直到结束:

从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为ec
browser=webdriver.Chrome()
browser.get('https://www.imdb.com/list/ls000004717/')
选择器='a[class*=“下一页”]'
页数=10
对于范围内的页面(页面):
#等待元素加载
WebDriverWait(浏览器,10)。直到(例如,元素的存在位置((By.CSS\u选择器,选择器)))
# ... 在这里进行分级解析
浏览器。通过css选择器(选择器)查找元素。单击()
另一个选项不是单击元素,而是使用
broswer.get(“…”)
导航到下一页:

从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为ec
#像以前一样设置浏览器并导航到该页面
browser=webdriver.Chrome()
browser.get('https://www.imdb.com/list/ls000004717/')
选择器='a[class*=“下一页”]'
基本url=https://www.imdb.com/list/ls000004717/'
page_扩展='?page='
#已经在page=1,所以只需要循环9次
对于范围内的页面(2,页面+1):
#等待页面加载
WebDriverWait(浏览器,10)。直到(例如,元素的存在位置((By.CSS\u选择器,选择器)))
# ... 在这里进行分级解析
下一页=基本url+页面扩展名+str(第页)
browser.get(下一页)

请注意:
field=browser。按名称(“…”)查找元素。click()
不会将
field
分配给webelement,因为
click()
方法没有返回值。

要单击文本为NEXT的元素,直到
901-1000/1000
页面,您必须:

  • scrollIntoView()
    一旦元素的
    可见性实现()
    就可以查看元素
  • 使
    元素的WebDriverWait可单击()
  • 您可以使用以下解决方案:

    • 代码块:

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.common.exceptions import TimeoutException
      
      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_experimental_option("excludeSwitches", ["enable-automation"])
      options.add_experimental_option('useAutomationExtension', False)
      driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
      driver.get('https://www.imdb.com/list/ls000004717/')
      driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.pagination-range"))))
      while True:
          try:
              WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "div.row.text-center.lister-working.hidden")))
              driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.pagination-range"))))
              WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.flat-button.lister-page-next.next-page"))).click()
              print("Clicked on NEXT button")
          except TimeoutException as e:
              print("No more NEXT button")
              break
      driver.quit()
      
    • 控制台输出:

      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      Clicked on NEXT button
      No more NEXT button
      

谢谢,这是它第一次工作,但页面只会翻一次(从1-100到101-200)——我希望它一直翻到最后(901-1000)。我有什么办法可以做到吗?谢谢你的详细回答。不幸的是,该算法在第2页停止,并显示以下内容:
elementclickinterceptedeexception:Message:element click intercepted:element在点(545,16)处不可单击。其他元素将收到点击:(会话信息:chrome=78.0.3904.108)
尽管您的方法在美学上看起来非常令人满意,屏幕会自动向下滚动到“下一步”按钮。@SlavaGrivachev更新了我的答案,以使用不同的点击策略。我还添加了一个显式的
sleep(5)
,因为
WebDriverWait
没有等待
Next
按钮完全加载。我在本地成功运行了此脚本。谢谢。它是完全有效的,但由于某些原因,在第7页标题768附近停止。“我还不知道原因,我将对此进行研究。”斯拉瓦格里瓦切夫我确实注意到第7页周围有一个有趣的问题。XPath返回电影“近亲”的链接(因为它包含字符串“Next”),并单击该链接而不是“Next”按钮。我已经用一个新的XPath为
next_按钮
更新了代码,它成功地点击了每个页面,包括第7页。循环也从未停止,因为“下一步”按钮即使在第10页上也没有消失。这也被修正了,通过将范围为(0,9)
的i的
while True
改为
。哇,这真是太迷人了。我们在这里使用了IMDb的俄语版本(语言是自动选择的),但我们没有找到原因。谢谢非常感谢,它完全起作用了。虽然af
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
Clicked on NEXT button
No more NEXT button