ken桑带你读源码之scrapy downloadermiddlewares
downloadermiddlewares 文件夹是下载中间件
其中 process_request 还没请求时的处理函数
process_response 请求之后的处理函数
chunked.py 简单说就是传输网页数据非常大的 或者 数据长度不确定用到 参考 http://blog.csdn.net/whatday/article/details/7571451
decompression.py 读取压缩文件 然后解压文件 替换 response 76行 response.replace(body=body, cls=respcls)
defaultheaders.py 获取默认的头部 settings['DEFAULT_REQUEST_HEADERS']
downloadtimeout.py 获取默认超时时间
httpauth.py 这个用户认证 是http认证 可以nginx 上配置的
httpcache.py 网页cache 首先判断 _dont_cache 是否为Ture 读取缓存 是否存在 是否过期 过期看这个 HTTPCACHE_EXPIRATION_SECS 一切正常就直接返回缓存 标识该request 已经缓存
特别有意思的是抓取出现异常 会调用缓存 哈哈
httpproxy.py 这个代码我就不说 但实际工作中 不用他的 我们会另外写一个代理池系统 存储 redis 然后再写一个中间件读取 代理ip 或者代理ip 存 squid 中间件也省了
redirect.py 该文件有两个中间件 RedirectMiddleware 服务器重定向中间件 判断 dont_redirect 是否为True 然后读取 response.headers['location'] 跳转过去
MetaRefreshMiddleware 网页重定向中间件 用正则 提取出 网页重定向的url 然后跳转
retry.py 重试中间件 判断 如果 http status 是否在 retry_http_codes request.meta.get('retry_times', 0) 是否超过 max_retry_times 然后 return request
特别有意思的是 发生异常 也会启用 重试中间件 这个非常实用!!!!! 超级赞
useragent.py 更新 User-Agent
stats.py 统计中间件 有一个统计异常很重要 30行 ex_class = "%s.%s" % (exception.__class__.__module__, exception.__class__.__name__)
32 行 self.stats.inc_value('downloader/exception_type_count/%s' % ex_class, spider=spider)
robotstxt.py 判断 robotstxt
ken桑带你读源码之scrapy downloadermiddlewares的更多相关文章
- ken桑带你读源码 之scrapy
开篇声明 文章讲解源码不一定从入口开始 主题更注重 思路讲解以及核心函数 ok? 废话到此为止 /scrapy/downloadermiddlewares/ 文件夹下是下载器的 中间件 ...
- ken桑带你读源码 之scrapy scrapy\core\scheduler.py
从英文来看是调度程序 我们看看是怎么调度 首先爬虫队列有两个 一个是保存在内存中 没有历史记录 重新开始 42行 self.mqs = self.pqclass(self._newmq) ...
- ken桑带你读源码 之scrapy scrapy\extensions
logstats.py 爬虫启动时 打印抓取网页数 item数 memdebug.py 爬虫结束 统计还被引用的内存 也就是说gc 回收不了的内存 memusage.py 监控爬虫 内存占用 ...
- ken桑带你读源码 之scrapy pipelines\images.py
大家先看看 http://www.cnblogs.com/attitudeY/p/7078559.html 下面我做一些补充 最新版本1.1 已经支持 下载路径保存到 item 48行 ...
- ken桑带你读源码 之 scrapy_redis
首先更大家说下 正式部署上线的爬虫会有分布式爬虫的需求 而且原本scrapy 的seen (判断重复url的池 不知道用啥词 已抓url吧 ) 保存在磁盘 url 队列 也是保存在磁盘 (保 ...
- Android AsyncTask完全解析,带你从源码的角度彻底理解
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...
- Java读源码之ReentrantLock
前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 R ...
- 带货直播源码开发采用MySQL有什么优越性
MySQL是世界上最流行的开源关系数据库,带货直播源码使用MySQL,可实现分钟级别的数据库部署和弹性扩展,不仅经济实惠,而且稳定可靠,易于运维.云数据库 MySQL 提供备份恢复.监控.容灾.快速扩 ...
随机推荐
- 【秒懂Java】【第1章_初识Java】04_学习资料
为了学到更多的新知识,我们经常会去网上搜索各种学习资料.或者,在学习.工作过程中遇到了解决不了的问题,我们也会去网上搜索答案(比如百度.谷歌一下).这篇文章,主要想跟大家聊聊关于学习资料的选择. 建议 ...
- JavaScript中__proto__与prototype的关系(转)
一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ ...
- dll备份注意事项
test.dll20161111和test.dll同目录的时候,会报错!因为这样跟test1.dll(只是重名民)的效果是一样的,都会报错的. 同目录的情况下,应该改成test.dll.ddd. 为了 ...
- 主存到Cache直接映射、全相联映射和组相联映射
转自:https://blog.csdn.net/dongyanxia1000/article/details/53392315 ---- Cache的容量很小,它保存的内容只是主存内容的一个子集,且 ...
- java语言基础(四)_面向对象_类_对象_封装_构造
面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...
- Netty 源码解析(五): Netty 的线程池分析
今天是猿灯塔“365篇原创计划”第五篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...
- UVA - 11300 Spreading the Wealth(数学题)
UVA - 11300 Spreading the Wealth [题目描述] 圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金 ...
- Least Cost Bracket Sequence,题解
题目链接 题意: 给你一个含有(,),?的序列,每个?变成(或)有一定的花费,问变成课匹配的括号的最小花费. 分析: 首先如果能变成匹配的,那么就有右括号的个数始终不多于左括号且左右括号数量相等,那就 ...
- Python-日期格式化
1.基本方法 获取当前日期:time.time() 获取元组形式的时间戳:time.local(time.time()) 格式化日期的函数(基于元组的形式进行格式化): (1)time.asctime ...
- 《Spring全局异常处理》从零掌握@ControllerAdvice注解
一.开门见山 在前后端分离框架的大趋势下,前后端基本的职责已经确定. 前端主要负责界面的处理以及基本的判空检验.数据来源则通过vue调用后端发布的接口. 后端的原型还是mvc的模式: controll ...