硒与美容组在刮网中的比较

2024-06-10 23:56:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

既然我可以通过像driver.find_element_by_xpath这样的方法找到元素并使用硒来获取它们的内容,那么当我可以对所有东西使用硒时,为什么要使用BeautifulSoup

在这个特殊的例子中,我需要使用Selenium来点击JavaScript按钮,那么使用Selenium来解析是更好呢,还是同时使用Selenium和Beautiful Soup呢?


Tags: 方法元素内容by网站driverseleniumelement
3条回答

我用硒来刮网,但它不是快乐的解决方案。在上一个项目中,我使用了https://github.com/chromedp/chromedp。它是比硒更简单的溶液。

我建议使用Selenium来处理诸如与web页面交互之类的事情,不管它是在一个成熟的浏览器中,还是在一个无头模式的浏览器中,比如无头Chrome。我还想说,beautifuldsoup更适合于观察和编写依赖于元素是否找到或找到了什么的语句,然后使用selenium在用户需要时执行与页面的交互任务。

在直接回答您的问题之前,值得一提的是:如果您需要做的只是从静态HTML页面中提取内容,那么您可能应该使用HTTP库(比如Requests或内置的^{})和^{}^{},而不是Selenium(尽管Selenium可能也足够)。不用硒的好处是:

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

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

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

  • 与页面一起提供的JavaScript已经将内容烘焙到其中。JavaScript只是用来做模板或其他DOM操作,将内容放入页面中。在这种情况下,您可能想看看是否有一种简单的方法可以使用regex直接从JavaScript中提取您感兴趣的内容。
  • JavaScript正在访问web API来加载内容。在这种情况下,请考虑是否可以识别相关的API url并自己点击它们;这可能比实际运行JavaScript和从web页面上删除内容要简单得多,也更直接。

如果您使用Selenium来决定您的情况的优点,请在headless模式下使用它,该模式至少由Firefox和Chrome驱动程序支持。Web spidering通常不需要实际以图形方式呈现页面,也不需要使用任何特定于浏览器的特性或特性,因此无头浏览器(其较低的CPU和内存成本以及更少的要崩溃或挂起的移动部件)是理想的。

相关问题 更多 >