Javascript Selenium与BeautifulSoup用于刮网

Javascript Selenium与BeautifulSoup用于刮网,javascript,python,selenium,beautifulsoup,Javascript,Python,Selenium,Beautifulsoup,我正在使用Python从网站上抓取内容。首先,我在Python上使用了BeautifulSoup和Mechanize,但我看到该网站有一个通过JavaScript创建内容的按钮,所以我决定使用Selenium 考虑到我可以使用Selenium和driver.find\u element\u by_xpath等方法查找元素并获取它们的内容,那么当我可以将Selenium用于所有事情时,使用BeautifulSoup有什么理由呢 在这种情况下,我需要使用Selenium来点击JavaScript按钮

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

考虑到我可以使用Selenium和
driver.find\u element\u by_xpath
等方法查找元素并获取它们的内容,那么当我可以将Selenium用于所有事情时,使用
BeautifulSoup
有什么理由呢


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

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

  • 带宽和运行脚本的时间。使用Selenium意味着获取在浏览器中访问页面时通常会获取的所有资源—样式表、脚本、图像等等。这可能是不必要的
  • 稳定性和易于错误恢复。根据我的经验,Selenium可能有点脆弱,即使使用PhantomJS,创建体系结构来杀死挂起的Selenium实例并创建一个新实例比在使用
    请求时设置简单的异常重试逻辑更令人恼火
  • 潜在的CPU和内存使用情况——取决于您正在爬行的站点,以及您试图并行运行的爬行线程的数量,可以想象DOM布局逻辑或JavaScript执行可能会非常昂贵
请注意,要求cookie正常工作的站点并不是打破Selenium的理由——您可以轻松创建URL打开功能,使用/,通过HTTP请求神奇地设置和发送cookie

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

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

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

我使用Selenium进行Web爬行,但这不是一个令人满意的解决方案。在我的上一个项目中,我使用了。这是一个比Selenium更简单的解决方案。

我建议使用Selenium与网页交互,无论是在完全成熟的浏览器中,还是在无头模式下的浏览器(如无头Chrome)。我还想说,beautiful soup更适合于观察和编写依赖于是否找到元素或找到了什么的语句,然后根据用户的意愿使用selenium来执行与页面的交互任务。

我以前从未使用selenium解析HTML,但beautiful soup非常健壮。这就是说,既然你已经在用硒来做某些事情,为什么不同时用硒来做这两件事,直到你知道你为什么需要其他东西为止?@crowder是的,目前我正在用硒来做所有的事情,但我以前用过BS,所以我想知道哪一种是最好的。关于解析,我认为它有点类似,例如,对于Selenium,我们有driver.find_elements_by_class_name(“…”),而对于BS,我们有soup.findAll(“…”,{class':“…”)。我看到BS有点慢,你觉得怎么样?@elie:这真的是关于你想要达到的目标。Selenium被设计为web ui自动化工具,如果您只想解析html,那就太过分了。如果您需要与页面进行某种交互,请使用Selenium。@user1177636谢谢。目前,我正在解析html并模拟单击javascript按钮以获取所有源代码。也许之后,我会有一些网页之间的互动,但目前还不确定。因此,如果我只是在解析,您认为最好使用BS进行解析,并且只对javascript按钮使用Selenium?Selenium启动了一个浏览器。。对于不需要这些就可以完成的任务来说,这是很大的开销。