解决 Python 下载 ZIP 文件失败的问题:从 DART 网站案例看关键点

解决 Python 下载 ZIP 文件失败的问题:从 DART 网站案例看关键点

引言

在用 Python 爬取网站内容时,下载文件(如 PDF 或 ZIP)是一个常见需求。然而,在访问韩国 DART(Data Analysis, Retrieval and Transfer System)网站(https://dart.fss.or.kr)时,我遇到了一个棘手的问题:通过 requests 库成功下载了 PDF 文件,但 ZIP 文件下载始终失败,返回空响应。本文将详细分析问题原因,分享解决思路,并总结通过代码获取网站内容时需要前期手动获取的关键信息,助你在类似场景中少走弯路。

问题描述

DART 网站提供公司披露文件的下载接口,包括 PDF(通过 pdf.do)和 ZIP(通过 zip.do)。我编写了一个 Python 脚本,从 listzip_zip.txt 文件读取下载链接,目标是将文件保存到本地 ./files 目录,文件名需添加 rcp_no_ 前缀,并正确处理韩文文件名。

初始代码逻辑如下:

  1. 使用 requests.Session 维持会话。
  2. 访问 DART 主页、披露页面和 main.do 页面初始化会话,获取 cookie(如 JSESSIONID)。
  3. 设置请求头,模拟浏览器(包括 User-AgentReferer 等)。
  4. 对每个 URL,发送 GET 请求,提取 Content-Disposition 中的文件名,保存文件。

代码片段(简化版):

import requests
import os
import re

session = requests.Session()
session.headers.update({
   
   
    'User-Agent': 'Mozilla/5.0 ...',
    'Accept': 'application/zip,application/pdf,*/*',
    'Referer': 'https://dart.fss.or.kr/pdf/download/main.do?rcp_no=20250429800466&dcm_no=10620925'
})

# 初始化会话
session.get('https://dart.fss.or.kr/')
session.get('https://dart.fss.or.kr/dsaf001/main.do')
session.get('https://dart.fss.or.kr/pdf/download/main.do?rcp_no=20250429800466&dcm_no=10620925')

# 下载文件
url = 'https://dart.fss.or.kr/pdf/download/zip.do?rcp_no=20250429800466&dcm_no=10620925'
response = session.get(url, stream=True)
if response.status_code == 200:
    content_length = response.headers.get('Content-Length')
    if content_length == '0' or (content_length is None and 'Transfer-Encoding' in response.headers):
        print('Empty response')
    else:
        # 保存文件逻辑
        with open('file.zip', 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)

运行结果

  • PDF 文件(pdf.do)下载成功,文件名正确,内容完整。
  • ZIP 文件(zip.do)下载失败,日志显示:
    Empty response for https://dart.fss.or.kr/pdf/download/zip.do?rcp_no=20250429800466&dcm_no=10620925 (Content-Length: chunked)
    Response headers: {
        'Date': 'Thu, 08 May 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值