由于页面无限加载,无法在 python 中通过 selenium 进行抓取

问题描述

我正在尝试提取一些新闻文章内容。一些网址需要登录才能访问完整内容。我决定使用 selenium 自动登录。但是,我无法提取内容,因为第一个 url 需要永远加载并且永远不会到达完成实际文本提取的点。它最终抛出超时异常。

这是我的代码

for url in url_list:
    chrome_options = Options()
    ua = UserAgent()
    userAgent = ua.random
    options.add_argument(f'user-agent={userAgent}')
    driver = webdriver.Chrome(ChromeDriverManager().install(),options = chrome_options)
    driver.get(url)
    time.sleep(5)
    frame = driver.find_elements_by_xpath('//iframe[@id="wallIframe"]')
    #Some articles require going through a paywall and some don't
    if len(frame)==0:
        text_element = driver.find_elements_by_xpath('//section[@id="main-content"]//article//p')
        text = " ".join(x.text for x in element)
    else:
        text = log_in(frame)
    driver.quit()

虽然代码从未触及它,但这是我的登录方法

def log_in(frame):
    driver.switch_to.frame(frame[0])
    driver.find_element_by_id("PAYWALL_V2_SIGN_IN").click()
    time.sleep(2)
    driver.find_elements_by_id("username")[0].send_keys(username)
    time.sleep(2)
    driver.find_elements_by_xpath('//button[text()="Continue"]')[0].click()
    time.sleep(1)
    driver.find_elements_by_id("password")[0].send_keys(password)
    time.sleep(1)
    element = driver.find_elements_by_xpath('//button[@type="submit"]')[0].click()
    time.sleep(1)
    text = parse_text(element)

我该如何解决这个问题?

解决方法

您应该使用 time.sleepWebDriverWait,而不是使用 expected_conditions 手动设置超时;这样,只有在满足特定条件(例如,元素可见或元素可点击)时,才会对元素执行的操作。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

try:
    frame = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,'//iframe[@id="wallIframe"]')))

except TimeoutException:
    print "Element not found."
,

将此添加到您的 chrome 选项:

options.page_load_strategy = 'eager'

“Eager”页面加载策略将等待 HTML 加载完毕,但不会等待加载 CSS、图像等。

还有更多关于 here 的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...