![868760a620915e8acd420716864cf9ad.png](https://i-blog.csdnimg.cn/blog_migrate/8df82e8917a4e3e10c50278d35d1abf0.jpeg)
![72d4a0f1573d0c54c34b3410dba492d9.png](https://i-blog.csdnimg.cn/blog_migrate/205582e497169a01e7f945297c701446.jpeg)
打开源码进入retry.py文件
我们可以看到两个方法 一个process_response 和process_exception
![daccb0e6297ffdc2efe2f33ce0b2af88.png](https://i-blog.csdnimg.cn/blog_migrate/b4049fe5b84682c3a297f1fd0d26f275.jpeg)
![b8119f11a3d4bee8f1626897e899a1fa.png](https://i-blog.csdnimg.cn/blog_migrate/2b9f1e2ac411c6774f22ffb68add110f.jpeg)
这两个方法他在干什么呢?
我们先看第一个if 判断 正常我们在用scrapy的时候你是没在meta 传这个键值 "dont_retry" 这个的意思就是 不去重试直接返回响应
第二个if 判断 就是说你会在setting文件中设置 一个默认重试的状态码他会去判断如果我们访问出现 默认设置的状态码 就会进行重试 也就是第三个方法 '_retry' 这个方法
- settings文件中 的默认状态码设置以及最大重试次数
![6d3a343eb15936676725217b69e7542c.png](https://i-blog.csdnimg.cn/blog_migrate/07f0791cda6020dc1843579dda02c74a.jpeg)
- 我们在看看 初始化方法 max_retry_times 和retry_http_codes 也就是最大重试次数和重试的状态码
![9c6db7b7a7b6dfac2e435b07a50d8687.png](https://i-blog.csdnimg.cn/blog_migrate/b0a1098900feae41f3f29a632ad15e2d.jpeg)
来我们看看在看看 _retry 的这个方法
![7f7a2faeb6100732c130fe7d79a7d160.png](https://i-blog.csdnimg.cn/blog_migrate/164ae054c559560b323a65133923266a.jpeg)
- 底下还有一截 不太重要就是一些响应和else 说一下超过最大次数 这页面就访问失败了
在来看看我们重写middleware之后的 代码
start_date
- 我重写了 process_response 和process_exception 这两个方法 然后自己加了一个save_url 的方法~ ok!
- save_url 的方法是怎么判断他执行保存failed_url呢 !答案就是和 源码的 _retry方法一样 我会在process_response 和 process_exception 两个方法中, 重试之前加一个save_url 方法让他在重试之前我去判断一下这个重试次数是否超过最大重试次数 如果大了 我们就把这个url存下来就可以 如果没大 我们就正常调用_retry 方法进行重试 等等...注:
- 该类继承自 RetryMiddleware,也就是源码的 类继承
- 需关闭 默认重试中间件 开启自定义中间件
![183e14f40d7ae90cdb6ceed799334ca1.png](https://i-blog.csdnimg.cn/blog_migrate/4860a85234e0c6c2ec15b4f2dffe78fd.png)
-
- 不知道还有什么坑点啦。遇到问题欢迎补充哈哈!