1.狭义的异常处理
当一次请求多个网页时,如果其中一个网页出错,那么整个程序就会终止,造成其他网页都无法完成请求。所以需要通过异常处理将可能出错的网页进行处理,以至于其他网页能被请求。
import requests
urls = ["http://wwww.baidussss.com", "http://news.baidu.com", "http://datahonor.com/404"]
def get_data(url):
data = requests.get(url)
return data.text
if __name__ == '__main__':
for url in urls:
get_data(url)
以上代码由于第一个网址就出错了,所以程序立即终止,没有请求其他网址;当错误网址在最后的时候,即使前面3个网址已经完成请求,也会因为错误网的存在而退出,不能完成任务。异常处理能够避免这种情况。以下为改进后的代码:
import requests
urls = ["http://wwww.baidussss.com", "http://news.baidu.com", "http://datahonor.com/404"]
def get_data(url):
# 将可能会报错的语句放在try语句块内
try:
data = requests.get(url)
# 将出错后的处理放在exceot语句块内
except requests.exceptions.ConnectionError as e:
print("请求错误, url: ", url)\
print("错误详情", e)
data = None
return data
if __name__ == '__main__':
for url in urls:
get_data(url)
try,except语句表达的含义是,先执行 data=requests.get(url),如果成功则跳过except继续执行,否则出现预期错误时,执行except内的语句。这样避免了因为个别网页请求错误而导致整个程序崩溃。tyr, except进一步了解代码如下。
def divide(x, y):
try:
result = x / y
except ZeroExceptionError:
print("division by zero!")
except ValueError:
print("Value Error")
else:
print("result is", result)
finally:
print("executing finally clause!")
注:try之后可以跟多个except语句,用于捕捉不同错误,如果except之后不佳具体错误类型,默认捕捉所有错误。else子句智能出现在except之后。finally 是在所有情况下都会被执行的语句,一般用于释放文件或者资源。
通过异常处理,既能够了解错误情况,又能够使得程序继续运行。从广义上来说,任何未达预期的情况都属于异常。
2.广义的异常处理
未达预期的情况,如请求遇到状态吗是5XX,这种情况不是自己代码出了问题,而是网站服务器有问题,是得不到网页内容的,而此时程序并不会报错,一般刷新就可以解决,所以我们代码通过模拟刷新这个操作就可以解决。
import time
import requests
urls = ["http://httpstat.us/500"]
def get_data(url, num_retries=3):
try:
data = requests.get(url)
print(data.status_code)
except requests.exceptions.ConnectionError as e:
print("请求错误,url", url)
print("错误详情:", e)
data = None
if (data!=None) and (500<=data.status_code<600):
if(num_retries>0):
print("服务器错误,正在重试")
time.sleep(1)
num_retries -= 1
get_data(url, num_retries)
return data
if __name__ == '__main__':
for url in urls:
get_data(url)
3.robot.txt略
此文为《puthon数据分析入门–从数据获取到可视化》书的学习笔记,有错之处还请指出。