【问题标题】:Web Scraping with Python Selenium performance使用 Python Selenium 性能进行 Web Scraping
【发布时间】:2020-01-16 05:29:13
【问题描述】:

根据性能,使用 BautifulSoup 进行网络抓取比使用 Selenium 的网络驱动程序快得多。但是我不知道从动态网页获取内容的任何其他方式。我认为差异来自浏览器加载元素所需的时间,但肯定不止于此。一旦浏览器加载页面(5 秒),我所要做的就是从表中提取一些 <tr> 标记。提取 1016 条记录大约需要 3-4 分钟,我认为这非常慢。我得出的结论是,用于查找 find_elements_by_name 等元素的 webdriver 方法很慢。来自 webdriver 的 find_elements_by.. 是否比 BeautifulSoup 中的 find 方法慢得多?如果我从 webdriver 浏览器获取整个 html 然后用 lxml 解析并使用 BeautifulSoup 会更快吗?

【问题讨论】:

  • 是的,您可以使用driver.page_source获取整个html
  • 是的,但是否确认 BeautifulSoup 的查找速度比 Selenium 中的查找速度快?
  • 是的,没错。 BeautifulSoup 比 Selenium 快得多
  • 我尝试用 BeautifulSoup 解析 driver.page_source,与之前的 3-4 分钟相比,它不到 10 秒要快得多。

标签: python performance selenium web-scraping beautifulsoup


【解决方案1】:

Web Scraping with Python 一起使用应该是测试策略的一部分。如果您的意图是抓取静态内容 BeautifulSoup,那么直截了当。但是如果网站内容是动态呈现的 Selenium 是要走的路。

话虽如此,BeautifulSoup 不会等待页面加载完成后在 DOM Tree 中不容易出现的动态内容。在使用 Selenium 时,您可以使用 Implicit Wait and Explicit Wait 来定位所需的动态元素。

最后,find_elements_by_name() 在性能方面可能会花费 delta,因为 Selenium 会将其转换为等效的 find_element_by_css_selector()。您可以在discussion中找到更多详细信息


结尾

Official locator strategies for the webdriver

【讨论】:

    【解决方案2】:

    是的,在等待页面准备好之后使用 Selenium 获取 HTML 然后使用 BeautifulSoup 或 lxml 解析该 HTML 会更快。

    另一种选择是使用Puppeteer 来获取 HTML 或直接获取您想要的信息。它也应该比 Selenium 更快。有一些非官方的 python 绑定:pyppeteer

    【讨论】:

      【解决方案3】:

      您也可以尝试在 javascript 中进行评估。例如:

      item = driver.execute_script("""return {
        div: document.querySelector('div').innerText,
        h2: document.querySelector('h2').innerText
      }""")
      

      将至少比这快 10 倍:

      item = {
        "div": driver.find_element_by_css_selector('div').text,
        "h2": driver.find_element_by_css_selector('h2').text
      }
      

      如果它在很多时候也比 BS 快,我不会感到惊讶。

      【讨论】:

        【解决方案4】:

        查看 2 个选项:

        1) 有时这些动态页面确实在<script> 标记中包含有效 json 格式的数据。可以使用requests获取html,beautifulsoup会获取<script>标签,然后可以使用json,loads()解析。

        2) 直接去源头。查看开发工具并搜索 XHR 以查看您是否可以直接转到 url/API 并生成数据并以这种方式返回数据(很可能再次以 json 格式返回)。在我看来,这是迄今为止更好/更快的选择(如果有的话)。

        如果您可以提供网址,我可以查看这些选项是否适用于您的情况。

        【讨论】:

          猜你喜欢
          • 2017-05-14
          • 2018-11-11
          • 2018-02-13
          • 2020-08-18
          • 2021-03-12
          • 1970-01-01
          • 2017-03-06
          • 2019-01-06
          • 2021-10-30
          相关资源
          最近更新 更多