如何避免urllib2.HTTPError 404导致程序终止并记录失败信息
解决Python爬取URL时404错误导致脚本终止的问题
嘿,作为Python新手遇到这种脚本突然中断的情况确实挺闹心的!不过别慌,咱们用Python的异常处理机制就能轻松解决——既让循环继续爬下一个URL,又能把访问失败的URL记录下来。
核心思路:捕获404异常
默认情况下,当urllib2遇到404错误时会抛出HTTPError,如果不处理这个异常,程序就会直接终止。咱们要做的就是用try-except块把访问URL的代码包裹起来,专门捕获这个404错误,然后在异常处理逻辑里记录失败的URL,之后循环就会自动继续执行下一个请求了。
完整代码示例
下面是针对你的需求写的代码,每一步都加了注释,方便你理解:
import urllib2 # 初始化一个列表,用来存储所有访问失败的URL failed_urls = [] # 循环遍历1到100000的entry ID for entry_id in range(1, 100001): # 拼接完整URL,注意要加上http/https协议前缀,否则urllib2会报错 full_url = f"https://example.com/entry/{entry_id}" try: # 尝试打开URL并获取响应 response = urllib2.urlopen(full_url) # 这里可以添加你处理正常响应内容的逻辑,比如读取页面内容 # content = response.read() print(f"✅ 成功访问:{full_url}") except urllib2.HTTPError as e: # 捕获HTTP错误,重点处理404情况 if e.code == 404: print(f"❌ 404错误:{full_url}") failed_urls.append(full_url) else: # 其他HTTP错误(比如500服务器错误)也可以一起记录 print(f"❌ HTTP错误 {e.code}:{full_url}") failed_urls.append(full_url) except Exception as e: # 捕获其他可能的异常,比如网络连接超时、DNS解析失败等 print(f"❌ 访问出错:{full_url},错误信息:{str(e)}") failed_urls.append(full_url) # 爬取完成后,把所有失败的URL写入本地文件,方便后续查看 with open("failed_urls.txt", "w") as file: for url in failed_urls: file.write(url + "\n") print(f"\n爬取任务完成!共记录 {len(failed_urls)} 个访问失败的URL,已保存到failed_urls.txt")
关键细节说明
try-except块:把可能抛出异常的代码放在try里,当异常发生时,程序会跳转到对应的except块执行,而不是直接终止。- 捕获特定异常:咱们专门捕获
urllib2.HTTPError,并通过e.code判断是不是404错误,这样能精准处理你的场景。 - 记录失败URL:用列表
failed_urls收集所有失败的URL,最后写入文件,方便你后续查看哪些URL被删除了。 - 协议前缀:一定要给URL加上
https://或http://,不然urllib2无法识别合法的网络地址,会抛出其他错误。
额外小建议(新手友好)
如果爬取速度太快,可能会被目标网站封禁IP,你可以在循环里加入延时:
import time # 在循环的最后添加一行 time.sleep(1) # 每次请求后暂停1秒
这样修改后,你的脚本就不会因为404错误中途停止了,会稳稳地爬完所有100k个URL,同时把所有失败的记录都保存下来~
内容的提问来源于stack exchange,提问作者J.doe
相关产品推荐
相关产品推荐

