一尘不染

selenium与BeautifulSoup进行网页抓取

selenium

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

假设我可以使用Selenium和诸如之类的方法来查找元素并获取其内容driver.find_element_by_xpath,那么BeautifulSoup当我可以对所有内容都使用Selenium时,有什么理由要使用?

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


阅读 455

收藏
2020-06-26

共1个答案

一尘不染

在直接回答您的问题之前,值得一开始:如果您需要做的就是从静态HTML页面提取内容,则可能应将HTTP库(例如Requests或内置urllib.request)与lxmlBeautifulSoup而不是Selenium(尽管硒可能也足够了)。不需要使用硒的优点:

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

请注意,要求cookie起作用的站点并不是破解Selenium的理由-
您可以轻松创建一个URL开启函数,该函数使用cookielib
/
cookiejar神奇地设置和发送HTTP请求中的cookie

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

  • 随页面提供的JavaScript具有已经包含在其中的内容。JavaScript就是在这里进行模板或其他DOM操作,将内容放入页面中。在这种情况下,您可能想看看是否有一种简单的方法可以使用regex直接从JavaScript中提取您感兴趣的内容。
  • JavaScript正在通过网络API加载内容。在这种情况下,请考虑是否可以识别相关的API URL并自己点击它们。与实际运行JavaScript并从网页上抓取内容相比,这可能更加简单直接。

如果您 确实
确定使用Selenium的情况值得考虑,请在无头模式下使用它,(至少)Firefox和Chrome驱动程序支持。Web爬虫通常不需要实际图形化显示页面,也不需要使用任何特定于浏览器的怪癖或功能,因此理想的选择是无头浏览器-
它具有较低的CPU和内存成本以及较少的死机或挂起活动部件。

2020-06-26