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

能否用Beautiful Soup实现Selenium同款ASC网站Excel数据下载功能?

用Beautiful Soup + Requests 替代Selenium实现ASC评估师数据批量下载

需求说明

需要爬取https://asc.gov/appraiser网站,按照「进入网站→快速搜索→点击Apply→点击Download→选择Excel格式→确认下载」的流程,将包含30万条结果的数据保存为Excel文件到指定目录,替代原有的Selenium方案(认为Selenium操作复杂)。

原Selenium参考代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import os
from selenium import webdriver
import time

options = webdriver.ChromeOptions()
prefs = {'download.default_directory': download_path, 'download.prompt_for_download': False,
'download.directory_upgrade': True,
'safebrowsing.enabled': True}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path=driverLocation, options=options)
driver.get('https://asc.gov/appraiser')
wait = WebDriverWait(driver, 10)

# 点击Apply按钮
apply_button = wait.until(EC.visibility_of_element_located((By.XPATH, '//span[text()="Apply"]')))
apply_button.click()

# 点击Download按钮
download_button = wait.until(EC.visibility_of_element_located((By.XPATH, '//a[text()="Download"]')))
download_button.click()

# 选择Excel单选按钮
excel_radio = wait.until(EC.visibility_of_element_located((By.ID, 'excel')))
excel_radio.click()

# 点击最终下载按钮
download_button_2 = wait.until(EC.visibility_of_element_located((By.ID, 'download')))
download_button_2.click()

解决方案(Requests + Beautiful Soup实现)

注:Beautiful Soup仅负责HTML解析,实际的请求发送、表单提交需要配合requests库完成,以下是完整实现代码:

import requests
from bs4 import BeautifulSoup
import os
from urllib.parse import urljoin

# 配置参数
BASE_URL = "https://asc.gov/appraiser"
DOWNLOAD_DIR = "你的目标下载目录路径"  # 替换为实际本地路径
os.makedirs(DOWNLOAD_DIR, exist_ok=True)

# 初始化会话(保持Cookie同步,模拟浏览器状态)
session = requests.Session()

# 1. 访问初始页面,获取表单必要参数
response = session.get(BASE_URL)
soup = BeautifulSoup(response.text, 'html.parser')

# 提取页面中的CSRF令牌(网站通常用这个做请求验证)
csrf_token = soup.find('input', {'name': 'csrfmiddlewaretoken'})['value']

# 2. 模拟点击Apply按钮:发送搜索请求
apply_url = urljoin(BASE_URL, "/appraiser/search")
form_data = {
    "search_type": "quick",  # 对应快速搜索类型
    "csrfmiddlewaretoken": csrf_token
}
session.post(apply_url, data=form_data)

# 3. 进入下载页面
download_page_url = urljoin(BASE_URL, "/appraiser/download")
response = session.get(download_page_url)
soup = BeautifulSoup(response.text, 'html.parser')

# 重新获取下载页面的CSRF令牌(部分网站会刷新令牌)
download_csrf_token = soup.find('input', {'name': 'csrfmiddlewaretoken'})['value']

# 4. 发送Excel格式下载请求
download_file_url = urljoin(BASE_URL, "/appraiser/download_file")
download_form_data = {
    "format": "excel",
    "csrfmiddlewaretoken": download_csrf_token
}
# 流式下载大文件,避免内存溢出
response = session.post(download_file_url, data=download_form_data, stream=True)

# 从响应头提取文件名
filename = response.headers.get('Content-Disposition').split('filename=')[1].strip('"')
file_path = os.path.join(DOWNLOAD_DIR, filename)

# 保存文件到指定目录
with open(file_path, 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

print(f"文件已成功保存至:{file_path}")

关键注意事项

  • 抓包确认参数:代码中的请求URL、表单字段(如search_type)需要通过浏览器开发者工具抓包实际请求来验证,网站结构可能会变动,需灵活调整。
  • 会话保持:requests.Session()会自动维护Cookie,确保请求状态和浏览器操作一致,避免权限或验证问题。
  • 大文件处理:使用stream=True分块下载30万条数据的Excel文件,防止内存占用过高。
  • 异常处理:实际使用时建议添加try-except块,处理网络请求失败、文件写入错误等异常场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:47:35