【问题标题】:How to Scrape Page HTML and follow Next Link in Selenium如何抓取页面 HTML 并遵循 Selenium 中的下一个链接
【发布时间】:2016-10-18 02:17:38
【问题描述】:

我正在尝试抓取一个网站进行研究,但我被卡住了。我希望刮板读取页面源,并将其附加到本地 HTML 文件中,以便我可以在校外分析数据。我已经尝试过BeautifulSoupScrapy,但我发现我需要使用Selenium 与页面交互才能浏览我大学的身份验证系统。 (我不包括该代码,因为它与我的问题无关。)

当我运行脚本时,它会导航到页面并单击链接,但它只保存第一页的 HTML。然后,每次单击链接时,它都会复制并附加该页面的 HTML。

如何使用Selenium 点击下一页链接、抓取 HTML 并保存到文件,直到到达最后一页?

source = driver.page_source

while True:
    with open("test.html", "a") as TestFile:
        TestFile.write(source)
        try:
            driver.implicitly_wait(200)
            driver.find_element_by_css_selector('li.next').click()
        except AttributeError:
            break

编辑:我将 AttributeError 添加到 except 并收到以下错误。

selenium.common.exceptions.StaleElementReferenceException:消息: 过时的元素引用:元素未附加到页面文档

我的假设是我需要放慢 .click() 的速度,这就是我最初有隐式等待的原因,但这似乎没有奏效。

【问题讨论】:

  • 摆脱你的裸体除了,你会得到一个更丰富的错误信息
  • 谢谢n1c9,我在except中添加了一个AttributeError,它给了我上面添加的错误代码:StaleElementReferenceException。
  • 页面上是否有任何弹出窗口或类似内容?还是像往常一样翻到下一页?另外,implicitly_wait(num) 应该在初始化 webdriver 时设置,但这只是一种风格。
  • 它会像往常一样翻阅页面,直到到达第 8 或第 9 页,然后它会抛出过时元素异常。

标签: python selenium


【解决方案1】:

您需要在 while 循环内将 page source 分配给 source 变量。

source = driver.page_source

while True:
with open("test.html", "a") as TestFile:
    TestFile.write(source)
    try:
        driver.implicitly_wait(200)
        driver.find_element_by_css_selector('li.next').click()
        source = driver.page_source
    except AttributeError:
        break

【讨论】:

  • 谢谢!这有帮助,但现在我在每个页面的输出中都得到了重复项。例如它输出: Page1Page1 Page1Page2Page2Page2Page3Page3
  • 点击下一个链接后,让你的脚本等待一段时间,然后获取页面源代码。
  • 我添加了一个等待,就像你建议的那样,它现在似乎正在工作。谢谢,@SudharsanSelvaraj
  • 很高兴为您提供帮助!
  • 如果这对您有帮助,请确保接受答案:)
猜你喜欢
  • 2016-08-21
  • 2016-04-30
  • 2020-09-21
  • 2019-04-03
  • 2011-12-13
  • 2019-07-02
  • 2021-01-12
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多