无法通过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
相关产品推荐
相关产品推荐

