使用 Selenium 更快地进行网页抓取(或更快的替代方案)

Ton*_*Ton 1 python ajax selenium web-scraping

伙计们,我目前有一个工作脚本,可以从某个页面抓取 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()
Run Code Online (Sandbox Code Playgroud)

pgu*_*rio 5

我有几个建议:

  • 切换到无头镀铬,它会更快

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

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

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

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

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

如果您完成所有这些工作,我预计您的时间会减少一半,如果您切换到 Puppeteer,时间会减少一半