Scrapy中的Downloader Middleware基础介绍

创建项目

scrapy startproject +项目名称

cd + 项目名称

scrapy genspider +爬虫名+要爬取的域名

创建结果如下:

打开spider文件做详细介绍:

# -*- coding: utf-8 -*-
import scrapy


class HttpbinSpider(scrapy.Spider):
    # 爬虫名称
    name = 'httpbin'
    # 允许爬取的域名
    allowed_domains = ['httpbin.org']
    # 起始url列表,默认从此列表抓取
    start_urls = ['http://httpbin.org/']

    def parse(self, response):
        pass

下载中间件Downloader Middleware

下载中间件是处于Scrapy的Request和Response之间的处理模块,在整个架构中起作用的位置是两个:

1. 在Scheduler调度处队列的Request发送给Downloder下载之前。

                  可以在Request执行下载之前对其进行修改。

2.在下载后生成的Response发送给Spider之前。

                 可以再生成的Response被Spider解析之前对其进行修改。

可以用来修改User-Agent、处理重定向、设置代理、失败重试、设置cookies都需要借助它来实现。

下面介绍一下Downloader Middleware的三个方法:

process_request(self, request, spider):

    请求被调度给Downloader之前,此方法就会调用,对Request进行处理。

    两个参数分别为,Request对象,对应的Spider。

process_response(self, request, response, spider):

    Downloader执行Request下载之后,会得到对应的Response,引擎会将Response发送给Spider进行解析,在发送之前,都可以用此方法对Response进行处理。

    参数有三个:

           request:Response对应的Request

           response:被处理的Response

           spider: 对应的Spider

process_exception(self, request, exception, spider):

     抛出异常时被调用。

     参数有三个:

           request:产生异常的Request.

           exception:抛出的异常.

           spider:产生的异常对应的Spider.

设置User-Agent

1、在setting.py里面加一行定义即可:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

2、设置随机的需要借助Downloader Middleware

class RandomUserAgentMiddleware():
    def __init__(self):
        self.user_agent = [
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
        ]
        
    def process_request(self,request,spider):
        request.headers["User-Agent"] = random.choice(self.user_agent)

要使之生效,需要在settings.py 文件中调用这个Downloader Middleware

DOWNLOADER_MIDDLEWARES = {
    'scrapydownloadertest.middlewares.RandomUserAgentMiddleware': 543,
}

重新运行之后可以看到已经改变:

这样,利用process_request()方法成功设置了随机的User-Agent。

process_response()


  Downloader Middleware在执行下载之后会得到Response,随后将Response发送给Spider处理。

  可以修对Response进行处理。

在RandomUserAgentMiddleware添加如下代码:

class RandomUserAgentMiddleware():
    def __init__(self):
        self.user_agent = [
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
            'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)',
        ]

    def process_request(self,request,spider):
        request.headers["User-Agent"] = random.choice(self.user_agent)
        
    def process_response(self,request,response,spider):
        #修改状态码
        response.status = 201
        return response

process_response返回response给spider:

self.logger.debug('Status Code' + str(response.status))

在spider中输出response.status即可看到结果,重新运行之后,观察到的结果如下:

猜你喜欢

转载自blog.csdn.net/qq_39138295/article/details/83830346