Python爬虫在断网时能捕获到哪些异常?
最近在学习爬虫,现在想要实现一个功能:爬取链接,如果断网,就将链接保存在本地文件。现在的问题是我不是很清楚这是否可行,如果可行应该捕获的哪一种异常呢? 以下是 sm.ms 的图片外链,但图片好像不能直接显示。
https://i.loli.net/2018/06/19/5b28b479c3591.jpg
https://i.loli.net/2018/06/19/5b28b479bfbc0.jpg
这两张图片是一起的,只是截图截不了所有,所以分开截取了。
Python爬虫在断网时能捕获到哪些异常?
fuliba?
在Python爬虫中,当网络连接中断时,主要会捕获到requests库或urllib库抛出的与连接相关的异常。
常见异常:
-
requests.exceptions.ConnectionError这是最直接的异常,表示底层网络连接失败,包括DNS查询失败、拒绝连接、服务器无响应等。断网时一定会触发此异常或其子类。import requests from requests.exceptions import ConnectionError try: response = requests.get('http://www.example.com', timeout=5) print(response.status_code) except ConnectionError as e: print(f"连接失败: {e}") -
requests.exceptions.Timeout如果设置了超时(timeout参数),在断网或网络极慢的情况下,连接阶段或读取响应阶段超过指定时间就会抛出此异常。它是ConnectionError的子类。import requests from requests.exceptions import Timeout try: response = requests.get('http://www.example.com', timeout=2) # 2秒超时 print(response.status_code) except Timeout: print("请求超时") -
urllib.error.URLError(使用urllib时) 如果使用标准库的urllib.request,在断网时会抛出URLError,其reason属性通常是一个socket.error或TimeoutError。from urllib.request import urlopen from urllib.error import URLError try: response = urlopen('http://www.example.com', timeout=5) print(response.read()[:100]) except URLError as e: print(f"URL错误: {e.reason}") -
底层的
socket.error(或OSError) 上述高级库的异常通常封装了底层的socket错误。在极少数直接使用socket编程的情况下,断网会引发socket.error(Python 3中合并入OSError),如[Errno 101] Network is unreachable。
处理建议:
在爬虫代码中,使用try...except块捕获requests.exceptions.ConnectionError和requests.exceptions.Timeout(或urllib.error.URLError)即可有效处理断网情况,并进行重试或记录日志。
一句话总结:主要捕获ConnectionError和Timeout异常进行重试处理。
是的,感觉爬图片是学爬虫的先行动力。
try:
爬虫(url)
except:
记录 url 到本地文件(url)
这个我已经试过了,不行。提问中的图片就是已经 catch 了各种异常,但还是不起作用。
干嘛不分开,先把链接保存,然后统一进行下载,还有,loli 的图床联通网络竟然无法访问
你自己电脑上断网打个断点调试不就知道了
Timeout exception
和谐再找其他的嘛。
我试了下,微博的图床可以直接显示,其他的都不行。
看具体是什么异常,超时还是请求返回有问题


