为何write()方法每次迭代写入的数据量均相同?
为什么write()每次写入的数据量都相同?
看起来你遇到的情况是每次调用fw.write(data.content)返回的写入字节数都一样,这大概率不是write()方法的问题,而是你通过c.get()获取的内容本身就每次都相同。咱们来一步步分析:
最可能的原因:请求未成功获取目标文件
你的代码里用c.get(direct_links[x])获取文件内容,但如果这个请求没有拿到真正的附件,反而每次都返回了相同的错误响应内容,那data.content的大小自然固定,导致写入的字节数一致。常见的场景有:
- 权限/登录问题:网站需要登录才能下载附件,但你的session
c没有携带有效的登录Cookie,每次请求都返回登录提示页面或者权限不足的页面,这些页面的大小通常是固定的。 - 反爬拦截:你的请求没有设置必要的请求头(比如
User-Agent、Accept),被网站识别为爬虫,每次返回相同的拦截页面(比如403错误页面)。 - 链接无效:
direct_links里的链接可能已经失效,或者指向了同一个错误页面。
排查和解决步骤
- 检查响应状态码:在
data = c.get(direct_links[x])之后添加状态码打印,快速判断请求是否成功:
如果状态码不是print(f"请求状态码:{data.status_code},目标链接:{direct_links[x]}")200(比如401未授权、403禁止访问、404不存在),那请求肯定出问题了。 - 查看响应内容:打印响应的前几百字节,确认拿到的是不是目标文件:
如果输出的是HTML代码(比如登录表单、错误提示),说明你获取的不是预期的附件。print(data.content[:500]) # 输出前500字节内容,判断是文件还是错误页面 - 添加请求头模拟浏览器:给session
c配置浏览器风格的请求头,避免被反爬拦截:c.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }) - 确认Session登录状态:如果网站需要登录才能下载,确保你在发起下载请求前已经通过
c.post()完成登录,且Cookie已正确保存到session中。 - 验证direct_links列表:检查列表中的每个链接是否都是不同的有效下载地址,没有重复或错误链接。
小提示
你的代码里有个逻辑小问题:print("After writing file : {}".format(direct_links[x]))这句话写在了写入文件之前,应该放到fw.write(data.content)之后,这样打印的内容才符合"写入后"的语境,不过这和当前的写入字节数问题无关~
内容的提问来源于stack exchange,提问作者Aakash Hirve
相关产品推荐
相关产品推荐

