【问题标题】:Making Webscraping with selenium faster (or faster alternatives)使用 selenium 更快地进行 Webscraping(或更快的替代方案)
【发布时间】:2020-05-06 15:45:51
【问题描述】:

伙计们,我目前有一个工作脚本,可以从某个页面抓取 ajax 内容...问题是它需要 +- 12 秒才能运行,而出于我的目的,我需要它更快。

有什么建议吗?

from urllib.parse import urlencode
import requests
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

def search_char():
    char_name_input = str(input('Search Character: ')) # User input / Character Name

    start_time = time.time()
    browser = webdriver.PhantomJS()


    search_url = 'https://www.tibia.com/community/?subtopic=characters' # URL 

    r = browser.get(search_url) # Searched Character Page

    element = browser.find_element_by_name("name")
    element.send_keys(char_name_input)
    element2 = browser.find_element_by_name("Submit").click()


    page = browser.find_element_by_id('Content')
    rendered_page = page.get_attribute('innerHTML')

    soup = BeautifulSoup(rendered_page, 'html.parser')



    selection = soup.find_all('td')

    lista = []
    for item in selection:
        lista.append(item.get_text())

    browser.close()

    print("--- %s seconds ---" % (time.time() - start_time))

    for i in lista:
        print(i,'\n')

search_char()

【问题讨论】:

  • 加快网页抓取速度:使用 API。 12 秒对于 UI 自动化的执行来说是一个极好的时间。我经常运行从 1 分钟(最少)到最多 15 分钟的脚本。在页面上呈现浏览器和 HTML 内容需要来自您正在自动化的网站的响应时间——Selenium / Python 实际上是实现 UI 自动化的最快方法。如果您想要更快的速度,请使用requests
  • HTMLUnit 可能快一点... cURL 对直接请求很有用。甚至邮递员?
  • @Christine - Selenium / Python 是最快的大胆声明。我想知道你是否尝试过 Puppeteer。
  • 我很想试一试!我经常使用 C#,所以增加的速度对我来说是新奇的。

标签: python ajax selenium web-scraping


【解决方案1】:

我有几点建议:

  • 改用headless chrome,会更快

  • 将 capabilities.pageLoadStrategy 设置为“none”并使用 WebDriverWait / EC 等待元素。这样它就可以在一切加载之前继续

  • 始终使用 css 选择器而不是 name/id/xpath

  • send_keys 很慢,请使用 javascript 设置这些值

  • 你不需要漂亮的汤,这里有一个如何获得这些的示例:

lista = browser.execute_script(" 返回 [...document.querySelectorAll('#Content td')].map(s => s.innerText) ")

如果你做所有这些,我希望你能把时间减半,如果你改用 Puppeteer,我希望你能把时间减半

【讨论】:

    【解决方案2】:

    首先,如果您要处理的网页元素是启用了JavaScript 的元素或包含AJAX 元素,那么没有现成的解决方案可以更快地抓取内容。但是,对于您的代码 sn-ps,这里有一些建议:

    • 如果您的用例涉及调用click()send_keys(),请始终为element_to_be_clickable() 引入WebDriverWait,如下所示:

    您可以在How to click on a element through Selenium Python找到详细讨论

    • 如果您的用例涉及调用get_attribute('innerHTML'),请始终为visibility_of_element_located() 引入WebDriverWait,如下所示:

    您可以在Python + Selenium: Wait until element is fully loaded找到详细讨论

    • 使用 CssSelectorXPath性能 方面存在一些差异。一些要点:
      • 对于初学者来说,XPath 和 CSS 之间的性能没有显着差异。
      • 在 IE8 等旧版浏览器中遍历 DOM 不适用于 CSS,但适用于 XPath。 XPath 可以向上遍历 DOM(例如从子节点到父节点),而 CSS 只能沿着 DOM 遍历(例如从父节点到子节点)。但是,在旧版浏览器中无法使用 CSS 遍历 DOM 并不一定是坏事,因为它更多地表明您的页面设计不佳,并且可以从一些有用的标记中受益。
      • 支持 CSS 的一个论点是它们更具可读性、简洁性和简洁性,但它是一种主观要求。
      • Ben Burton 提到您应该使用 CSS,因为这就是构建应用程序的方式。这使测试更易于编写、讨论和让其他人帮助维护。
      • Adam Goucher 表示要采用一种更加混合的方法——首先关注 ID,然后是 CSS,并仅在需要时使用 XPath(例如,遍历 DOM),对于高级定位器来说,XPath 总是更强大。
      • 可以在Why should I ever use CSS selectors as opposed to XPath for automated testing?找到详细讨论

    参考

    您可以在How to speed up Java Selenium Script,with minimum wait time找到相关的详细讨论

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 2012-07-05
      • 2012-01-23
      • 2013-07-13
      • 2011-02-27
      • 2010-09-22
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多