爬虫保存文件异常:出现0kb空文件的解决方法

本文介绍了在使用爬虫抓取文件并保存时遇到的问题——由于文件名不符合Windows命名规范而导致的保存失败或文件名截断现象。特别是针对包含非法字符(如英文冒号)的情况进行了分析,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在保存爬虫获取的文件中,如果文件不是利用代码进行递增或其他遍历命名时,需要考虑分配的文件名是否符合系统的文件命名规范:

例如:

执行如上保存命令时,str_title是某个网页中的<title>标签中的文本,此时str_title中可能包含windows命名规范中禁止的符号,因此可能导致文件保存失败。

而如果该段保存文件的代码在try;except;下但并未捕获错误时,可能会得到如下的结果:

 这些文件是在爬取网易新闻时获取的,可以发现这些文件的命名都不完整。

检索原始网页:

 

 

可以发现都是在英文冒号“:”中断开,而在用包含英文冒号的字符命名windows文件时:

 

 所以出现0kb的空文件的原因就水落石出了。

解决方法:

在代码中添加过滤机制,防止有违反命名规范的命名出现。

在Python中,你可以使用socket库来编写这样的程序。以下是一个简单的示例,展示了如何创建TCP连接到www.people.com.cn,发送GET请求并读取响应: ```python import socket import urllib.request def connect_and_get(url): # 创建socket连接 host = 'www.people.com.cn' port = 80 # HTTP默认端口 response = b'' try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) # 发送GET请求 request = f"GET {url} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n".encode() sock.sendall(request) # 接收服务器响应 while True: data = sock.recv(4096) # 每次接收4KB数据 if not data: break # 数据接收完毕或出错 response += data sock.close() except Exception as e: print(f"Error occurred: {e}") # 解析并保存网页内容 content_type, _ = response.split(b'\r\n', 1) if 'text/html' in content_type.decode(): with open('webpage.txt', 'wb') as f: f.write(response) print("Webpage content saved to webpage.txt") # 对于图片等二进制资源,需要额外处理 start_line = response.find(b"Content-Disposition") # 查找开始位置 if start_line != -1: # 如果找到头信息 img_start = response[start_line:].find(b"\nContent-Type:") # 寻找图片类型行 img_data = response[start_line + img_start + len("\nContent-Type: "):] img_name = url.split('/')[-1] # 获取图片名称 with open(img_name, 'wb') as img_file: img_file.write(img_data) print(f"Image {img_name} saved") # 调用函数并设置URL connect_and_get('http://www.people.com.cn') ``` 注意这只是一个基本示例,实际应用中可能需要处理更复杂的异常情况,如超时、编码问题等。同时,对于大型网站,直接通过socket可能会遇到反爬虫策略,最好使用urllib库的`request.urlopen()`方法,并遵守网站的robots.txt规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值