Python爬虫在断网时能捕获到哪些异常?

最近在学习爬虫,现在想要实现一个功能:爬取链接,如果断网,就将链接保存在本地文件。现在的问题是我不是很清楚这是否可行,如果可行应该捕获的哪一种异常呢? 以下是 sm.ms 的图片外链,但图片好像不能直接显示。

https://i.loli.net/2018/06/19/5b28b479c3591.jpg

https://i.loli.net/2018/06/19/5b28b479bfbc0.jpg

这两张图片是一起的,只是截图截不了所有,所以分开截取了。


Python爬虫在断网时能捕获到哪些异常?

13 回复

在Python爬虫中,当网络连接中断时,主要会捕获到requests库或urllib库抛出的与连接相关的异常。

常见异常:

  1. 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}")
    
  2. 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("请求超时")
    
  3. urllib.error.URLError (使用urllib时) 如果使用标准库的urllib.request,在断网时会抛出URLError,其reason属性通常是一个socket.errorTimeoutError

    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}")
    
  4. 底层的socket.error (或OSError) 上述高级库的异常通常封装了底层的socket错误。在极少数直接使用socket编程的情况下,断网会引发socket.error(Python 3中合并入OSError),如[Errno 101] Network is unreachable

处理建议: 在爬虫代码中,使用try...except块捕获requests.exceptions.ConnectionErrorrequests.exceptions.Timeout(或urllib.error.URLError)即可有效处理断网情况,并进行重试或记录日志。

一句话总结:主要捕获ConnectionErrorTimeout异常进行重试处理。

是的,感觉爬图片是学爬虫的先行动力。

try:
爬虫(url)
except:
记录 url 到本地文件(url)

这个我已经试过了,不行。提问中的图片就是已经 catch 了各种异常,但还是不起作用。

干嘛不分开,先把链接保存,然后统一进行下载,还有,loli 的图床联通网络竟然无法访问

你自己电脑上断网打个断点调试不就知道了

fuliba 这站 竟然没有被和谐。。

Timeout exception

和谐再找其他的嘛。

我试了下,微博的图床可以直接显示,其他的都不行。

看具体是什么异常,超时还是请求返回有问题

回到顶部