javascript - 用于网页抓取的 Selenium 与 BeautifulSoup

标签 javascript python selenium beautifulsoup

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

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

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

最佳答案

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

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

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

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

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

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

关于javascript - 用于网页抓取的 Selenium 与 BeautifulSoup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436014/

相关文章:

javascript - 验证不带任何 http 、 https 或 ftp 的 URL

python - 如何子类化 QPointF 并设置自定义属性?

Python boto ec2 - 我如何等到图像创建或失败

Python:未安装 _imagingft C 模块

firefox - 如果 Firefox 未激活,Capybara/Selenium 的 jquery 自动完成测试将不起作用

javascript - 如何覆盖元素样式使其无法更改?

javascript - 计算 AngularJS 中包含特定属性的对象

javascript - 我的循环有问题吗?

javascript - 将元素拖放到特定位置 - Selenium、WebDriverJS

javascript - 如何使用 Python、JavaScript 或 Robot Framework 和 Selenium 使用部分标题文本导航到新的浏览器窗口