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