Downloader Middleware

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值