在直接回答您的问题之前,值得先说一下:如果您需要做的只是从静态 HTML 页面中提取内容,您可能应该使用带有 or 的 HTTP 库(如Requests或内置urllib.request
),而不是 Selenium (尽管硒可能也足够了)。不需要不必要地使用 Selenium 的优点:lxml
BeautifulSoup
- 带宽和运行脚本的时间。使用 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 和内存成本以及较少的崩溃或挂起的移动部件 - 是理想的。