爬虫之scrapy中间件

        scrapy主要有两种----中间件爬虫中间件和下载器中间件,这里主要介绍的是下载器中间件DownloaderMiddleware,下载器中间件相当于是在引擎与下载器中间的拦截器,可以在下载器发送请求之前对请求的参数进行修改,比如ip代理,userAgent,都可以在DownloaderMiddleware中完成添加。DownloaderMiddleware默认有五个方法:

process_request():听名字就知道是引擎从调度器拿到url后丢给下载器进行的时候,要经过process_request,ip代理和ua设置就是在这个位置,此方法有三种返回值,返回值是None则经过下一个中间件,返回值是request对象则将resquest对象发送个引擎,并不再向后执行,返回值是response对象,则将resp队形返回给引擎,并不在向后执行。

process_response():这个是当下载器完成请求后,把请求返回给下载器的路上,要经过process_response(),它只有两种返回值,返回值若是response对象,继续向下一个中间件进行,若返回值是request()对象,直接返回给引擎,引擎会返回给调度器。

process_exception():当请求发生错误异常时,这个中间件才会运行

spider _opened():爬虫开始前执行。

from_craeler():这个比较特俗一点,可以说是自定义中间件方法的一个声明,看介绍

    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        #在Scrapy中使用这种方法来创建你自己的爬虫
        s = cls()
        #看着这个东西熟悉吗,没错这就是我们的spider_open方法。
        #其中  s.spider_opened 是方法执行的功能,signals.spider_opened执行时间
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        #这里也可以用同样发放写一个在爬虫关闭时调用的方法
        crawler.signals.connect(s.spider_close, signal=signals.spider_closed)
        return s

添加后记得新建一个名为spider_close方法。ctrl+鼠标左键点击signals.spider_opened可以看到scrapy中执行时间都有哪些。

engine_started = object()
engine_stopped = object()
spider_opened = object()
spider_idle = object()
spider_closed = object()
spider_error = object()
request_scheduled = object()
request_dropped = object()
request_reached_downloader = object()
request_left_downloader = object()
response_received = object()
response_downloaded = object()
headers_received = object()
bytes_received = object()
item_scraped = object()
item_dropped = object()
item_error = object()

注意,中间件也是要在setting中打开的。

scrapy中间件设置userAgent:

首先最好先在setting中准备一个ua池,

UserAgent = [
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
    ]

在process_request()调用时随机选择其中一个:

    from settings import UserAgent
    def process_request(self, request, spider):
       
        userAgent = random.choice(UserAgent)
        request.headers['User-Agent'] = userAgent

        return None

设置代理也是同样的流程:免费代理的话先在setting中建一个代理IP池,然后从中随机选择一个,但是免费的大多时不能用的,还是收费的好用一些。

    def process_request(self, request, spider):
    
        ipstring = request.get('http://v2.api.juliangip.com/company/postpay/getips?num=1&pt=1&result_type=text&split=1&trade_no=6029336031352998&sign=c6deaa0dac6d6e7693')
        
        request.meta['proxy'] = 'https://'+ipstring

        return None

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值