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

如何用Scrapy替代Selenium模拟输入框录入数据并触发按钮点击

解决Scrapy迁移中输入交互与按钮点击的问题

你的核心问题在于:原Selenium代码是模拟浏览器前端交互,而Scrapy的FormRequest仅适用于HTML表单(<form>标签)提交,当前场景没有表单,所以无法直接套用。下面提供两种可行方案:

方案1:抓包直接调用后台API(推荐)

大多数现代网站的搜索/输入交互都会通过AJAX请求后台API,跳过前端模拟,直接构造API请求效率更高:

  1. 打开浏览器F12→Network标签,输入"Boston Park Plaza"时,观察XHR/Fetch请求,找到携带搜索关键词的接口;
  2. 复制该接口的URL、请求方法(GET/POST)、请求参数/Headers;
  3. 在Scrapy中直接构造请求:
import json

def parse(self, response):
    # 替换为你抓包得到的真实API地址
    search_api = "https://target-site.com/api/location-search"
    # 替换为抓包得到的参数结构
    payload = {"query": "Boston Park Plaza"}
    yield scrapy.Request(
        url=search_api,
        method="POST",
        body=json.dumps(payload),
        headers={"Content-Type": "application/json"},
        callback=self.after_search
    )

方案2:Scrapy结合浏览器模拟(适配反爬严格场景)

如果网站反爬机制复杂,API难以破解,可以用Scrapy集成Selenium/Playwright继续模拟浏览器交互:

以Scrapy+Selenium为例:

  1. 安装依赖:pip install scrapy-selenium
  2. 在项目settings.py中配置:
DOWNLOADER_MIDDLEWARES = {
    'scrapy_selenium.SeleniumMiddleware': 800
}
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = '/你的chromedriver路径'
SELENIUM_DRIVER_ARGUMENTS = ['--headless=new']  # 无头模式,可去掉改为可视化
  1. 在Spider中编写模拟逻辑:
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def start_requests(self):
    yield SeleniumRequest(
        url="https://target-site.com",  # 目标页面URL
        callback=self.parse_interaction
    )

def parse_interaction(self, response):
    driver = response.request.meta['driver']
    # 模拟输入
    input_elem = driver.find_element(By.ID, "location-typeahead-home-input")
    input_elem.send_keys("Boston Park Plaza")
    # 用显式等待替代time.sleep,提升稳定性
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//main[@id='main-content']//button"))
    )
    # 点击按钮
    buttons = driver.find_elements(By.XPATH, "//main[@id='main-content']//button")
    if len(buttons) >=2:
        buttons[1].click()
    else:
        buttons[0].click()
    # 等待页面跳转完成
    WebDriverWait(driver, 10).until(EC.url_changes(response.url))
    # 传递当前页面给后续回调
    yield scrapy.Request(
        url=driver.current_url,
        callback=self.after_search,
        meta={'driver': driver}
    )

关键说明

  • FormRequest仅针对传统HTML表单提交,不适用于JS动态交互场景;
  • 优先选择方案1,因为纯API请求速度远快于浏览器模拟;
  • 浏览器模拟时,显式等待(WebDriverWait)比time.sleep更可靠,能避免因加载延迟导致的元素找不到问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:35:30