Selenium与BeautifulSoup用于网络抓取

eli*_*lie 35 javascript python selenium beautifulsoup

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

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

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

Mar*_*ery 52

直接回答你的问题之前,这是值得一说为出发点:如果你需要做的是从静态的HTML页面拉内容,你应该使用一个HTTP库(如请求或内置urllib.request)用lxmlBeautifulSoup不硒(虽然Selenium也可能足够了).不必使用Selenium的优点:

  • 带宽.使用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和内存成本以及较少的移动部件来崩溃或挂起 - 是理想的选择.