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

Python爬虫:如何检测目标链接的文件附件并阻止自动下载?

解决方法

要阻止爬虫下载文件附件,核心是先判断目标链接是否为文件,再决定是否访问,下面给两种实用方案:

方案1:通过文件扩展名快速过滤

先列好常见的文件后缀,检查链接结尾是否属于这些类型,是就跳过:

# 定义要拦截的文件扩展名集合
blocked_exts = {'.pdf', '.doc', '.docx', '.xls', '.xlsx', '.zip', '.rar', '.exe', '.csv', '.txt'}

# 获取搜索结果里的目标链接
target_url = h.a.get('href')

# 检查链接后缀,非文件链接才继续处理
if not any(target_url.lower().endswith(ext) for ext in blocked_exts):
    driver.get(target_url)
    soup = BeautifulSoup(driver.page_source, "html.parser")
    source_text = soup(text=re.compile(wp_string))
else:
    # 可选:记录跳过的链接
    print(f"跳过文件链接:{target_url}")

这种方法简单高效,适合绝大多数带扩展名的文件链接场景。

方案2:通过HTTP响应头精准判断

如果遇到不带扩展名的下载链接(比如https://xxx.com/download?file=123),可以先发送HEAD请求获取响应头,判断是否为文件:

import requests

target_url = h.a.get('href')

try:
    # 发送HEAD请求,只拿响应头,不下载内容
    resp = requests.head(target_url, allow_redirects=True)
    content_type = resp.headers.get('Content-Type', '')
    content_disposition = resp.headers.get('Content-Disposition', '')
    
    # 判断是否为文件:要么是常见文件的Content-Type,要么响应头里有attachment(附件标识)
    is_file = (
        'application/pdf' in content_type or
        'application/msword' in content_type or
        'application/vnd.openxmlformats' in content_type or
        'application/zip' in content_type or
        'attachment' in content_disposition.lower()
    )
    
    if not is_file:
        driver.get(target_url)
        soup = BeautifulSoup(driver.page_source, "html.parser")
        source_text = soup(text=re.compile(wp_string))
    else:
        print(f"跳过文件链接:{target_url}")
except requests.exceptions.RequestException as e:
    # 处理链接失效等异常情况
    print(f"链接请求失败:{target_url},错误:{str(e)}")

这种方法更准确,但需要额外安装requests库,还要处理请求异常和重定向。

兜底方案:修改浏览器下载设置

如果上面的过滤有漏网之鱼,可以直接配置ChromeDriver禁止自动下载:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 配置浏览器不自动下载文件
prefs = {
    "download.prompt_for_download": True,  # 弹出下载提示,不自动保存
    "plugins.always_open_pdf_externally": True,  # PDF直接打开而非下载
    "download.default_directory": "/tmp"  # 即使下载也存临时目录,避免占用空间
}
chrome_options.add_experimental_option("prefs", prefs)

# 初始化driver时传入配置
driver = webdriver.Chrome(options=chrome_options)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:34