downloader middleware作用:改写请求,如加入代理,加入头部等;处理异常等。

# downloadMiddleware举例, 加代理
# 这里的类如果已经重新设置名称,记得在settings里面开启的时候改成这个名称
class ProxyMiddleware(object):
# logging模块负责输出调试信息,记录程序错误等
logger = logging.getLogger(__name__) # process_request如果返回
# 1: 如果返回None, 则对整个环节没什么影响,会继续执行其他操作
# 2: 如果返回response,则不再调用其他中间键的process_request,而是直接调用process_response,直接处理该方法返回的response
# 3: 如果返回request,则把request重新放到调度队列,进行循环调用
# 4: 如果返回IgnoreRequest异常,则会启用异常处理方法 # 一:改写请求过程
# 对请求环节进行重写,这一切发生在请求之前,比如加一个头部或者代理,用来控制程序如何请求
# 处理request环节,如加代理
# def process_request(self, request, spider):
# self.logger.debug('Using proxy...')
# # 在这里即把一个键为proxy赋值给meta,meta相当于一个容器,在这里存放代理ip
# request.meta['proxy'] = 'http://61.52.157.66:53281'
#
# 二:改写结果
# process_response如果返回
# 1:如果返回response,对其他中间键没什么影响,其他会照常执行
# 2:如果返回Request,则会重新发起请求,加入到调度中心
# 3:如果返回IgnoreRequest exception,则会调用异常处理的方法 # 以下为处理response环节,比如改写response的状态码
def process_response(self, request, response, spider):
response.status_code = 201
return response # 三:异常处理
# process_exception异常处理
# 1: 如果返回None,则不影响其他操作,继续执行process_exception
# 2: 如果返回response,表明已经成功返回,那么就会执行其他中间键的process_response
# 3: 如果返回request,则把request重新加入到调度队列,可以利用这一点进行失败重试
def process_exception(self, request, exception, spider):
# 我们这里建立捕捉到异常后进行重新发起请求,记得 改settings里面的ROBOTSTXT_OBEY = False # 用self.logger输出调试信息,代表此时已经出错了
self.logger.debug('已经出错了')
self.logger.debug('开始尝试代理') # 这时将,request重新设置一下,传入meta的新代理地址,返回的全新的request会重新加入到队列进行请求
request.meta['proxy'] = 'http://1.255.53.81:80'
return request
#异常处理对应的spider
class GoogleSpider(scrapy.Spider):
name = "google"
allowed_domains = ["www.google.com"]
start_urls = ['http://www.google.com/'] # 我们还记得有了start_url, 默认是由start_request遍历start_urls列表,并且调用make_request_from_url,进行请求
# 这里重新写了make_request_from_url,里面的参数进行重新加载,设置如果超时时间为10秒,如果超出10秒,则会抛出异常
# 如果请求不到,终端会频繁打出retry,可以在settings里面禁止,设置方法为:'scrapy.downloadermiddlewares.retry.RetryMiddleware':None,
def make_requests_from_url(self, url):
self.logger.debug('第一次请求')
return scrapy.Request(url=url, meta={'download_timeout':10},callback=self.parse,dont_filter=True) def parse(self, response):
print(response.text)

Downloader Middleware的更多相关文章

  1. Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换

    总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...

  2. Scrapy学习篇(十)之下载器中间件(Downloader Middleware)

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...

  3. scrapy之 downloader middleware

    一. 功能说明 Downloader Middleware有三个核心的方法 process_request(request, spider) process_response(request, res ...

  4. 爬虫--Scrapy之Downloader Middleware

    下载器中间件(Downloader Middleware) 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和respons ...

  5. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  6. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  7. 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 爬虫(十五):Scrapy框架(二) Selector、Spider、Downloader Middleware

    1. Scrapy框架 1.1 Selector的用法 我们之前介绍了利用Beautiful Soup.正则表达式来提取网页数据,这确实非常方便.而Scrapy还提供了自己的数据提取方法,即Selec ...

  9. Python之爬虫(二十五) Scrapy的中间件Downloader Middleware实现User-Agent随机切换

    总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...

随机推荐

  1. java项目和java-web项目中文件和文件夹的含义

    1. java项目 .project:是工程构建配置文件 .classpath:保存的是项目所用的外部引用包的路径 .settings:记录项目配置变化的记录文件夹 src:sourcefolder项 ...

  2. 笔记:Spring Cloud Hystrix 封装命令

    使用继承的方式来创建Hystrix 命令,不是用注解的方式来使用 Hystrix 创建 HelloGetCommand 对象,继承与 HystrixCommand 并实现 run 方法,示例如下: p ...

  3. 笔记:MyBatis XML配置详解

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...

  4. poj 2503 查字典

    Description You have just moved from Waterloo to a big city. The people here speak an incomprehensib ...

  5. newInstance()和new()的区别

    转载:http://www.jobui.com/mianshiti/it/java/7148/ newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何pub ...

  6. cisco交换机实现端口聚合

    0x00前言: 今天听老师讲端口聚合,为了方便日后复习故此有 了本篇随笔. 0x01准备工具: cisco模拟器 0x02:目录 为什么要用端口聚合? 广播风暴? 扩展:SMTP 0x03正文: 为什 ...

  7. Eclipse中的所有快捷键列表

    Eclipse中的所有快捷键列表: Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制 ...

  8. SQL根据B表内容修改A表内容,查询表中重复记录,删除掉重复项只保留一条

    以下sql是a,b两张表通过关联条件id修改a表值,如果b表有重复数据记录,选第一条更新,红色条件为附加限制条件,具体视情况而定: UPDATE a SETname = b.fname,pwd = b ...

  9. 201621123050 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  10. Java 密码学算法

    Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...