You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium操控Chrome时页面无法加载,疑似JS执行异常

自动化域名Squat检测的Selenium加载问题

我想用Python Selenium自动化完成https://haveibeensquatted.com/上的域名检测流程,但遇到了问题——用Selenium运行时页面无法加载检测结果,手动操作等待却一切正常。以下是我的代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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
import csv
import time

# === CONFIGURATION ===
INPUT_DOMAINS = [
    "example.com",
    "nonexistent-domain-xyz123.org",
    # add more domains here
]
OUTPUT_CSV = "squatted_results.csv"
URL = "https://haveibeensquatted.com/"

# === SET UP SELENIUM WITH CHROME ===
options = webdriver.ChromeOptions()
service = Service(ChromeDriverManager().install())

driver = webdriver.Chrome(service=service, options=options)
wait = WebDriverWait(driver, 20)
results = []

# XPaths
RESULTS_READY_XPATH = "/html/body/main/div[3]/header/div/div/div[2]/div[2]/span[2]"
ITEMS_XPATH = "/html/body/main/div[1]/div[3]/div/div/div/form/following-sibling::div//ul/li"
NO_SQUAT_XPATH = "//div[contains(text(),'No squatted permutations')]"
TABLE_CELL_XPATH = "/html/body/main/div[3]/div/div/div[2]/div/table/tbody/tr/td"

try:
    for domain in INPUT_DOMAINS:
        # Load fresh page for each domain
        driver.get(URL)

        # Enter domain
        input_xpath = "/html/body/main/div[1]/div[3]/div/div/div/form/div[2]/input"
        btn_xpath = "/html/body/main/div[1]/div[3]/div/div/div/form/button"
        input_box = wait.until(EC.element_to_be_clickable((By.XPATH, input_xpath)))
        input_box.clear()
        input_box.send_keys(domain)
        driver.find_element(By.XPATH, btn_xpath).click()
        time.sleep(1000)

finally:
    driver.quit()

# Save results to CSV
with open(OUTPUT_CSV, "w", newline='', encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["domain", "status"])
    writer.writerows(results)

print(f"Done! Results saved to '{OUTPUT_CSV}'")

问题原因

  1. 不合理的等待方式:time.sleep(1000)是固定超长等待,不仅完全没必要,还可能因为页面异步请求未完成就继续执行(或超时),导致结果无法正确加载;更关键的是当前代码根本没有提取结果的逻辑,自然无法生成有效CSV。
  2. 自动化识别拦截:网站可能通过检测Selenium的默认特征(如navigator.webdriver标识)限制自动化请求,导致检测流程无法正常触发。
  3. 未使用正确的等待条件:页面检测结果是动态生成的,需要等待特定元素出现来确认结果加载完成,而非盲目等待。

修复后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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
import csv

# === CONFIGURATION ===
INPUT_DOMAINS = [
    "example.com",
    "nonexistent-domain-xyz123.org",
    # 添加更多域名
]
OUTPUT_CSV = "squatted_results.csv"
URL = "https://haveibeensquatted.com/"

# === SET UP SELENIUM WITH CHROME ===
options = webdriver.ChromeOptions()
# 禁用自动化标识,避免被网站检测
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
# 模拟正常浏览器窗口
options.add_argument("--start-maximized")

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
wait = WebDriverWait(driver, 30)
results = []

try:
    for domain in INPUT_DOMAINS:
        driver.get(URL)
        
        # 输入域名并提交
        input_box = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='domain']")))
        input_box.clear()
        input_box.send_keys(domain)
        submit_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']")))
        submit_btn.click()
        
        try:
            # 等待无 squat 结果的提示
            wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(text(),'No squatted permutations')]")))
            results.append([domain, "无 squat 域名"])
        except TimeoutException:
            # 如果无结果提示没出现,等待结果列表加载
            wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "ul.list-group")))
            squat_items = driver.find_elements(By.CSS_SELECTOR, "ul.list-group li")
            # 收集所有squat域名,用分号分隔
            squat_domains = "; ".join([item.text.strip() for item in squat_items])
            results.append([domain, f"检测到 squat 域名: {squat_domains}"])

finally:
    driver.quit()

# 保存结果到CSV
with open(OUTPUT_CSV, "w", newline='', encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["域名", "检测状态"])
    writer.writerows(results)

print(f"完成!结果已保存到 '{OUTPUT_CSV}'")

关键修改说明

  • 反检测配置:添加了禁用自动化标识的选项,让Selenium模拟正常浏览器行为,避免被网站拦截。
  • 替换XPATH为CSS选择器:CSS选择器比硬编码的绝对XPATH更稳定,不易因页面结构微小变动失效。
  • 智能等待逻辑:先尝试等待无结果提示,超时则认为存在squat结果,再等待结果列表加载,确保结果正确提取。
  • 结果提取与存储:完善了结果收集逻辑,将检测到的squat域名或无结果状态存入列表,最终生成有效CSV。

内容的提问来源于stack exchange,提问作者mazix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:58:14