用于网页抓取的 Selenium 与 BeautifulSoup
Posted
技术标签:
【中文标题】用于网页抓取的 Selenium 与 BeautifulSoup【英文标题】:Selenium versus BeautifulSoup for web scraping 【发布时间】:2013-06-30 10:27:59 【问题描述】:我正在使用 Python 从网站上抓取内容。首先,我在 Python 上使用了BeautifulSoup
和Mechanize
,但我看到该网站有一个通过 javascript 创建内容的按钮,所以我决定使用Selenium
。
鉴于我可以使用 Selenium 和 driver.find_element_by_xpath
之类的方法找到元素并获取它们的内容,那么当我可以将 Selenium 用于所有事情时,还有什么理由使用 BeautifulSoup
?
在这种特殊情况下,我需要使用 Selenium 来单击 JavaScript 按钮,那么使用 Selenium 进行解析更好还是应该同时使用 Selenium 和 Beautiful Soup?
【问题讨论】:
我以前从未使用 Selenium 来解析 html,但 BeautifulSoup 相当健壮。也就是说,既然您已经将 Selenium 用于某事,为什么不将它用于两者,直到您知道为什么需要其他东西? @crowder 是的,目前我正在使用 Selenium 做所有事情,但我之前使用过 BS,所以我想知道哪个是最好的。关于解析,我认为它有点相同,例如,对于 Selenium,我们有 driver.find_elements_by_class_name("...") 和 BS 我们有 soup.findAll('...', 'class' :'....')。我看到BS有点慢,你怎么看? @elie:这真的是关于你想要达到的目标。 Selenium 被设计为 web ui 自动化工具,如果你只是想解析 html,那就有点大材小用了。如果您需要与页面进行某种交互,请使用 Selenium。 @user1177636 谢谢。目前我只是在解析 html 并模拟单击 javascript 按钮以获取所有源代码。也许之后我会在一些页面之间进行一些交互,但目前还不确定。因此,如果我只是在解析,您认为最好使用 BS 并仅将 Selenium 用于 javascript 按钮? 【参考方案1】:在直接回答您的问题之前,值得先说一下:如果您需要做的只是从静态 HTML 页面中提取内容,您可能应该使用 HTTP 库(如 Requests 或内置的 @987654322 @) 与 lxml
或 BeautifulSoup
,而不是 Selenium(尽管 Selenium 可能也足够了)。不用 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 和内存成本以及更少的崩溃或挂起的移动部件 - 是理想的。
【讨论】:
【参考方案2】:我建议将 Selenium 用于诸如与网页交互之类的事情,无论是在成熟的浏览器中,还是在无头模式的浏览器中,例如无头 Chrome。我还想说,beautiful soup 更适合观察和编写依赖于是否找到元素或找到 WHAT 的语句,然后根据用户需要使用 selenium 执行与页面的交互任务。
【讨论】:
【参考方案3】:我使用 Selenium 进行网页抓取,但这不是 高兴 的解决方案。在我的上一个项目中,我使用了 https://github.com/chromedp/chromedp 。它比 Selenium 更简单。
【讨论】:
以上是关于用于网页抓取的 Selenium 与 BeautifulSoup的主要内容,如果未能解决你的问题,请参考以下文章
从零开始学Python-使用Selenium抓取动态网页数据
使用scrapy-selenium, chrome-headless抓取动态网页