# -*-coding:utf-8-*-
# chrome for testing: https://registry.npmmirror.com/binary.html?path=chrome-for-testing/114.0.5735.90/
# chromedrive: https://registry.npmmirror.com/binary.html?path=chromedriver/114.0.5735.90/
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
chrome_options = Options()
chrome_options.add_argument("--headless=new") # 无头模式
chrome_options.add_argument("--no-sandbox") # 禁用沙箱
chrome_options.add_argument("--disable-dev-shm-usage") # 解决共享内存问题
chrome_options.add_argument("--disable-gpu") # 禁用 GPU 加速
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 移除 "自动化控制" 提示
chrome_options.add_experimental_option('useAutomationExtension', False) # 禁用自动化扩展
# from webdriver_manager.chrome import ChromeDriverManager
# from selenium.webdriver.chrome.service import Service
def get_element_value():
# 1. 初始化 Chrome 浏览器
# 如果你没有配置环境变量,需要在括号内指定 chromedriver 的路径
#driver = webdriver.Chrome()
#driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver = webdriver.Chrome(options=chrome_options)
# 3. 执行 CDP 命令,彻底隐藏 webdriver 属性 (关键步骤)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
try:
# 2. 打开目标网页
url = "https://quote.abc.com/q/123.html" # 示例URL,请替换为你实际的目标网址
print(f"正在访问: {url}")
driver.get(url)
# 3. 设置显式等待
# 这一步非常关键,因为 Selenium 渲染页面需要时间
wait = WebDriverWait(driver, 10)
# element = wait.until(
# EC.presence_of_element_located((By.CLASS_NAME, "quote_quotenums"))
# )
css_selector = "div.quote_quotenums > div.zxj > span:nth-child(1) > span"
element = wait.until(
lambda d: d.find_element(By.CSS_SELECTOR, css_selector).text.strip() != ""
)
# 4. 获取元素的值
# 情况A: 如果 "zxj" 是输入框(input),获取用户输入的值用 .get_attribute('value')
# 情况B: 如果 "zxj" 是普通标签(如 span, div),获取包裹的文本用 .text
element = driver.find_element(By.CLASS_NAME, "quote_quotenums")
text_value = element.text
print(f"成功获取 class='quote_quotenums' 的文本内容: {text_value}")
except TimeoutException:
print("错误:在 10 秒内未找到目标元素,页面加载可能过慢或元素不存在。")
finally:
# 5. 关闭浏览器,释放资源
driver.quit()
print("浏览器已关闭。")
if __name__ == "__main__":
get_element_value()
发布于
AI总结: 本文介绍了一个使用Selenium进行网页数据抓取的Python脚本。脚本配置了Chrome浏览器的无头模式,禁用了沙箱和GPU加速,并通过CDP命令隐藏了webdriver属性,以避免被网站检测。它打开指定的网页,设置显式等待,查找特定CSS选择器的元素,并获取其文本内容。最后,脚本在完成后关闭浏览器。改进建议包括增加错误处理以应对网络问题,优化等待条件以提高效率,以及提供更灵活的URL输入方式。