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

无法通过requests或Selenium访问目标PDF文档的技术求助

解决PDF链接首次跳转首页的批量下载问题

问题场景

我有大量URL,每个URL对应不同的PDF文档,示例链接:https://ccmspa.pinellascounty.org/PublicAccess/ViewDocumentFragment.aspx?DocumentFragmentID=74223655&CheckDocumentGroups=0
首次打开该链接大概率会进入网站首页,但再次粘贴打开则会加载PDF文档。尝试编写Python脚本下载这些文档以便用tika提取内容,但首次跳转首页的问题阻碍了所有尝试:

  • 使用requests请求,仅返回首页HTML内容;
  • 尝试用Selenium打开页面后将Cookie同步到requests会话,未生效,响应CookieJar为空;
  • 尝试用Selenium新开窗口加载链接,仅返回空HTML页面。

核心原因分析

这类网站通常通过会话Cookie验证访问状态,首次访问时会强制跳转到首页初始化会话,只有当会话中存在有效Cookie时,才能直接加载PDF资源。之前的尝试失败,大概率是因为没有完整获取并复用网站要求的会话Cookie,或者缺少必要的请求头(比如User-Agent、Referer)。

可行解决方案

方案1:用Selenium完成会话初始化+直接保存PDF

通过Selenium模拟完整的浏览器会话,先触发首页初始化,再访问目标URL,等待PDF加载后直接保存文件。

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

def download_pdf_with_selenium(url, save_path):
    # 初始化Chrome浏览器(需确保chromedriver与浏览器版本匹配)
    options = webdriver.ChromeOptions()
    # 配置PDF自动下载,避免弹窗
    prefs = {
        "download.default_directory": save_path,
        "download.prompt_for_download": False,
        "plugins.always_open_pdf_externally": True
    }
    options.add_experimental_option("prefs", prefs)
    # 可选:启用无头模式,不显示浏览器窗口
    # options.add_argument('--headless=new')
    
    driver = webdriver.Chrome(options=options)
    try:
        # 先访问网站首页,初始化会话
        driver.get("https://ccmspa.pinellascounty.org/PublicAccess/")
        time.sleep(2)  # 等待会话初始化完成
        
        # 访问目标PDF链接
        driver.get(url)
        # 等待页面加载完成(可根据实际情况调整等待逻辑)
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
        time.sleep(3)  # 给足够时间让PDF下载完成
    finally:
        driver.quit()

# 示例调用
download_pdf_with_selenium(
    "https://ccmspa.pinellascounty.org/PublicAccess/ViewDocumentFragment.aspx?DocumentFragmentID=74223655&CheckDocumentGroups=0",
    "./pdfs/"
)

方案2:Selenium获取有效Cookie后,用requests批量下载

先通过Selenium获取初始化后的会话Cookie,再用requests复用这些Cookie请求目标URL,获取PDF内容。

from selenium import webdriver
import requests
import time

def get_valid_cookies():
    driver = webdriver.Chrome()
    try:
        # 访问首页初始化会话
        driver.get("https://ccmspa.pinellascounty.org/PublicAccess/")
        time.sleep(2)
        # 访问一个PDF链接触发Cookie更新
        driver.get("https://ccmspa.pinellascounty.org/PublicAccess/ViewDocumentFragment.aspx?DocumentFragmentID=74223655&CheckDocumentGroups=0")
        time.sleep(2)
        # 转换Cookie为requests可用的格式
        cookie_jar = requests.cookies.RequestsCookieJar()
        for cookie in driver.get_cookies():
            cookie_jar.set(
                cookie['name'], 
                cookie['value'], 
                domain=cookie['domain'], 
                path=cookie['path']
            )
        return cookie_jar
    finally:
        driver.quit()

def download_pdf_with_requests(url, cookie_jar, save_path):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    # 发送请求,允许自动重定向
    response = requests.get(url, headers=headers, cookies=cookie_jar, allow_redirects=True)
    if response.status_code == 200 and 'application/pdf' in response.headers.get('Content-Type', ''):
        with open(save_path, 'wb') as f:
            f.write(response.content)
        print(f"成功下载:{save_path}")
    else:
        print(f"下载失败,响应状态码:{response.status_code},内容类型:{response.headers.get('Content-Type')}")

# 批量处理流程
cookie_jar = get_valid_cookies()
url_list = [
    "https://ccmspa.pinellascounty.org/PublicAccess/ViewDocumentFragment.aspx?DocumentFragmentID=74223655&CheckDocumentGroups=0",
    # 添加其他需要下载的URL...
]
for idx, url in enumerate(url_list):
    save_path = f"./pdfs/document_{idx}.pdf"
    download_pdf_with_requests(url, cookie_jar, save_path)

关键注意事项

  • 确保Chrome浏览器与chromedriver版本完全匹配,否则Selenium无法正常启动;
  • 调整等待时间(time.sleep或WebDriverWait),根据网站实际加载速度灵活设置;
  • 若网站有反爬机制,可添加Referer请求头,或者启用Selenium的无头模式降低被识别概率;
  • 若请求后仍返回首页,检查是否遗漏了关键Cookie,可通过浏览器开发者工具对比手动访问时的Cookie列表。

内容的提问来源于stack exchange,提问作者Diaa Eldin Malek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:20:23