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

