【问题标题】:html source is not always present in angular js page via seleniumhtml 源代码并不总是通过 selenium 出现在 Angular js 页面中
【发布时间】:2018-02-24 18:42:14
【问题描述】:

我试图抓取一个主要是 angularjs 的网站。 我的基本代码如下所示。

我正在传递参数,取回 html,然后通过查找我知道存在的 id 为“next”的元素来检查是否存在分页。

问题是,对于一个我知道“下一个”元素打开的页面,我的代码只在某些时候找到它,而其他时候它根本看不到它。

我认为这可能与我在呈现 html 之前检查这一事实有关,但我不确定为什么它有时会起作用。

感谢任何指针或建议。

def getBrowser():
browser = webdriver.Chrome('C:\\chromedriver_win32\\chromedriver.exe')

return browser


def getPage(browser):
    html = browser.page_source
    soup = BeautifulSoup(html, "lxml")
    return soup

webBrowser = getBrowser()
webBrowser.get("my page")
mainPage = getPage(webBrowser)

pagination = mainPage.select('#next')

#this value is randomly populated, and randomly a blank list.
print(pagination)

【问题讨论】:

  • 您应该等待 N 时间,或者可能在获取页面源之前等待存在的元素...您在哪里指定要加载的页面?或者你只是在等待主页?这里似乎缺少很多代码,这些代码将显示您指示浏览器检索的内容...
  • 只是缺少实际链接,我不想发布主链接。差不多就是这样。我尝试添加一个 sleep() 命令,达到 20 秒之类的疯狂值,它没有任何区别。即使没有睡眠,我也可以“随机”获得“下一个”元素。
  • 找到了解决方案。需要第二次 sleep(),一次在 webBrowser.get("my page") 之后约 5 秒,另一次在 mainPage = getPage(webBrowser) 之后再持续 5 秒。

标签: python selenium screen-scraping


【解决方案1】:

放弃睡眠,使用 selenium 的 WebdriverWait().until 以及 visibility_of_element_located 或类似的预期条件找到元素。它会在找到所需元素的那一刻停止等待,如果没有找到它,您可以捕获 TimeoutException 并引发一个可读性很好的异常,这样您就可以确切地知道您的尝试失败的原因,不仅仅是明天,而是从现在开始的几年。超时和轮询时间都是可自定义的。

每次您发现自己要使用 time.sleep 时,问问自己是否面临 1% 的自动化用例,在这些用例中它被认为是最佳方法。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2017-06-06
    • 2018-12-02
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多