用于网页抓取的 Selenium 与 BeautifulSoup

Posted

技术标签:

【中文标题】用于网页抓取的 Selenium 与 BeautifulSoup【英文标题】:Selenium versus BeautifulSoup for web scraping 【发布时间】:2013-06-30 10:27:59 【问题描述】:

我正在使用 Python 从网站上抓取内容。首先,我在 Python 上使用了BeautifulSoupMechanize,但我看到该网站有一个通过 javascript 创建内容的按钮,所以我决定使用Selenium

鉴于我可以使用 Selenium 和 driver.find_element_by_xpath 之类的方法找到元素并获取它们的内容,那么当我可以将 Selenium 用于所有事情时,还有什么理由使用 BeautifulSoup

在这种特殊情况下,我需要使用 Selenium 来单击 JavaScript 按钮,那么使用 Selenium 进行解析更好还是应该同时使用 Selenium 和 Beautiful Soup?

【问题讨论】:

我以前从未使用 Selenium 来解析 html,但 BeautifulSoup 相当健壮。也就是说,既然您已经将 Selenium 用于某事,为什么不将它用于两者,直到您知道为什么需要其他东西? @crowder 是的,目前我正在使用 Selenium 做所有事情,但我之前使用过 BS,所以我想知道哪个是最好的。关于解析,我认为它有点相同,例如,对于 Selenium,我们有 driver.find_elements_by_class_name("...") 和 BS 我们有 soup.findAll('...', 'class' :'....')。我看到BS有点慢,你怎么看? @elie:这真的是关于你想要达到的目标。 Selenium 被设计为 web ui 自动化工具,如果你只是想解析 html,那就有点大材小用了。如果您需要与页面进行某种交互,请使用 Selenium。 @user1177636 谢谢。目前我只是在解析 html 并模拟单击 javascript 按钮以获取所有源代码。也许之后我会在一些页面之间进行一些交互,但目前还不确定。因此,如果我只是在解析,您认为最好使用 BS 并仅将 Selenium 用于 javascript 按钮? 【参考方案1】:

在直接回答您的问题之前,值得先说一下:如果您需要做的只是从静态 HTML 页面中提取内容,您可能应该使用 HTTP 库(如 Requests 或内置的 @987654322 @) 与 lxmlBeautifulSoup,而不是 Selenium(尽管 Selenium 可能也足够了)。不用 Selenium 的好处:

运行脚本的带宽和时间。使用 Selenium 意味着获取在浏览器中访问页面时通常会获取的所有资源 - 样式表、脚本、图像等。这可能是不必要的。 稳定性和易于错误恢复。根据我的经验,Selenium 可能有点脆弱 - 即使使用 PhantomJS - 并且创建架构以杀死挂起的 Selenium 实例并创建一个新实例比在使用 requests 时设置简单的异常重试逻辑更令人恼火. 可能,CPU 和内存使用率 - 根据您正在抓取的站点以及您尝试并行运行的蜘蛛线程的数量,可以想象 DOM 布局逻辑或 JavaScript 执行可能会变得非常昂贵。李>

请注意,需要 cookie 才能运行的网站并不是破坏 Selenium 的理由 - 您可以轻松地创建一个 URL 打开函数,使用 cookielib/cookiejar 神奇地设置和发送带有 HTTP 请求的 cookie。

好的,那您为什么要考虑使用 Selenium?几乎完全可以处理您要抓取的内容通过 JavaScript 添加到页面的情况,而不是烘焙到 HTML 中。即使这样,您也可以在不破坏重型机器的情况下获得所需的数据。通常适用以下场景之一:

与页面一起提供的 JavaScript 已将内容烘焙到其中。 JavaScript 只是用来进行模板或其他将内容放入页面的 DOM 操作。在这种情况下,您可能想看看是否有一种简单的方法可以使用正则表达式直接从 JavaScript 中提取您感兴趣的内容。 JavaScript 正在使用 Web API 来加载内容。在这种情况下,请考虑您是否可以识别相关的 API URL 并自己点击它们;这可能比实际运行 JavaScript 和从网页上抓取内容更简单、更直接。

如果您确实确定您的情况值得使用 Selenium,请在无头模式下使用它,这由(至少)Firefox 和 Chrome 驱动程序支持。 Web 爬虫通常不需要实际以图形方式呈现页面,或使用任何特定于浏览器的怪癖或功能,因此无头浏览器 - 具有较低的 CPU 和内存成本以及更少的崩溃或挂起的移动部件 - 是理想的。

【讨论】:

【参考方案2】:

我建议将 Selenium 用于诸如与网页交互之类的事情,无论是在成熟的浏览器中,还是在无头模式的浏览器中,例如无头 Chrome。我还想说,beautiful soup 更适合观察和编写依赖于是否找到元素或找到 WHAT 的语句,然后根据用户需要使用 selenium 执行与页面的交互任务。

【讨论】:

【参考方案3】:

我使用 Selenium 进行网页抓取,但这不是 高兴 的解决方案。在我的上一个项目中,我使用了 https://github.com/chromedp/chromedp 。它比 Selenium 更简单。

【讨论】:

以上是关于用于网页抓取的 Selenium 与 BeautifulSoup的主要内容,如果未能解决你的问题,请参考以下文章

爬虫---selenium动态网页数据抓取

从零开始学Python-使用Selenium抓取动态网页数据

使用scrapy-selenium, chrome-headless抓取动态网页

使用 selenium 和 bs4 进行网页抓取

使用 Selenium Python 进行网页抓取 [Twitter + Instagram]

在 selenium 中加速网页抓取