【问题标题】:Scraping delayed ajax with Selenium / Splinter使用 Selenium / Splinter 抓取延迟的 ajax
【发布时间】:2014-04-15 14:51:01
【问题描述】:

我正在尝试编写一个脚本来确定潜在的新住宅是否有可用的 Verizon FiOS 服务。

不幸的是,该网站对 javascript 的广泛使用使一切都无法正常工作。我正在使用 selenium(包装在 splinter 模块中)让 javascript 执行,但我无法通过第二页。

这是脚本的简化版本:

from splinter import Browser

browser = Browser()
browser.visit('https://www.verizon.com/FORYOURHOME/ORDERING/OrderNew/OrderAddressInfo.aspx')

nameAddress1 = "ctl00$body_content$txtAddress"
nameZip = "ctl00$body_content$txtZip"
formFill = {nameAddress1: '46 Demarest Ave',
            nameZip: '10956'}
browser.fill_form(formFill)
browser.find_by_id('btnContinue').first.click()

if browser.is_element_present_by_id('rdoAddressOption0', wait_time=10):
    browser.find_by_id('rdoAddressOption0').first.click()
    browser.find_by_id('body_content_btnContinue').first.click()

在这个例子中,当它要求确认地址时,它选择了第一个选项。

它因 ElementNotVisibleException 而出错。如果我删除 is_element_present 检查,它会出错,因为它找不到元素。该元素在 selenium 控制的实时浏览器中可见且可点击,但 selenium 似乎没有看到页面 HTML 的更新版本。

作为替代方案,我认为我可以执行 POST 请求并使用请求或机械化处理响应,但是有一些我无法理解的有趣重定向。

如何让 selenium 正常运行,或者绕过 javascript/ajax 并使用 GET 和 POST 请求来实现?

【问题讨论】:

    标签: python ajax selenium web-scraping splinter


    【解决方案1】:

    问题是你点击的输入真的被设置display: none 样式隐藏了。

    要解决此问题,请执行 javascript 代码以单击输入并设置 checked 属性:

    browser.execute_script("""var element = document.getElementById('rdoAddressOption0');
                              element.click();
                              element.checked=true;""")
    browser.find_by_id('body_content_btnContinue').first.click()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2011-08-03
      • 1970-01-01
      • 2011-03-11
      • 2021-05-21
      • 2021-12-02
      相关资源
      最近更新 更多