能否用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
相关产品推荐
相关产品推荐

