53

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

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

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

4

3 回答 3

90

在直接回答您的问题之前,值得先说一下:如果您需要做的只是从静态 HTML 页面中提取内容,您可能应该使用带有 or 的 HTTP 库(如Requests内置urllib.request),而不是 Selenium (尽管硒可能也足够了)。不需要不必要地使用 Selenium 的优点:lxmlBeautifulSoup

  • 带宽和运行脚本的时间。使用 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 和内存成本以及较少的崩溃或挂起的移动部件 - 是理想的。

于 2013-07-02T22:09:03.587 回答
3

我建议将 Selenium 用于诸如与网页交互之类的事情,无论是在成熟的浏览器中,还是在无头模式的浏览器中,例如无头 Chrome。我还想说,漂亮的汤更适合观察和编写依赖于是否找到元素或找到了什么的语句,然后如果用户愿意,可以使用 selenium 执行与页面的交互任务。

于 2019-04-02T23:36:54.913 回答
-8

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

于 2018-04-25T07:42:20.953 回答