2020-01-10
小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基

人生苦短,我用 Python

前文传送门:

小白学 Python 爬虫(1):开篇

小白学 Python 爬虫(2):前置预备(一)基本类库的装置

小白学 Python 爬虫(3):前置预备(二)Linux基本入门

小白学 Python 爬虫(4):前置预备(三)Docker基本入门

小白学 Python 爬虫(5):前置预备(四)数据库基本

小白学 Python 爬虫(6):前置预备(五)爬虫框架的装置

小白学 Python 爬虫(7):HTTP 基本

小白学 Python 爬虫(8):网页基本

小白学 Python 爬虫(9):爬虫基本

小白学 Python 爬虫(10):Session 和 Cookies

小白学 Python 爬虫(11):urllib 基本运用(一)

小白学 Python 爬虫(12):urllib 基本运用(二)

小白学 Python 爬虫(13):urllib 基本运用(三)

小白学 Python 爬虫(14):urllib 基本运用(四)

小白学 Python 爬虫(15):urllib 基本运用(五)

小白学 Python 爬虫(16):urllib 实战之爬取妹子图

小白学 Python 爬虫(17):Requests 基本运用

小白学 Python 爬虫(18):Requests 进阶操纵

小白学 Python 爬虫(19):Xpath 基操

小白学 Python 爬虫(20):Xpath 进阶

小白学 Python 爬虫(21):剖析库 Beautiful Soup(上)

小白学 Python 爬虫(22):剖析库 Beautiful Soup(下)

小白学 Python 爬虫(23):剖析库 pyquery 入门

小白学 Python 爬虫(24):2019 豆瓣影戏排行

小白学 Python 爬虫(25):爬取股票信息

小白学 Python 爬虫(26):为啥买不起上海二手房你都买不起

小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到摒弃(上)

小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到摒弃(下)

小白学 Python 爬虫(29):Selenium 猎取某大型电商网站商品信息

小白学 Python 爬虫(30):代办基本

小白学 Python 爬虫(31):本身构建一个简朴的代办池

小白学 Python 爬虫(32):异步要求库 AIOHTTP 基本入门

小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基本(一)

小白学 Python 爬虫(34):爬虫框架 Scrapy 入门基本(二)

小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基本(三) Selector 选择器

弁言

Downloader Middleware 直译过来是下载器中间件,本文后续就叫它下载中间件了。

下载器中间件重要用于 Scrapy 的 Request 和 Response 处置惩罚。

Downloader Middleware 的功用非常的壮大,能够修正 UA 头、处置惩罚重定向、设置代办、设置超时时刻、失利重试、设置 Cookies 等功用。

内置下载器中间件

Scrapy 已为我们供应相当多的内置的下载器中间件,用于种种功用,列表以下:

{
    'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
    'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
    'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
    'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
    'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
    'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
}

这些列表定义在 DOWNLOADER_MIDDLEWARES_BASE 变量中。

这些列表的数据结构是一个字典花样,背面的值代表了优先级,数字越小代表了越接近 Scrapy 引擎,数字越大越接近下载器,数字小的会被优先挪用。

自定义下载器中间件

假如要在项目自定义一个下载器中间件,须要我们本身设置 DOWNLOADER_MIDDLEWARES 这个变量,这个变量位于 settings.py ,默许是解释状况,当我们须要的时刻直接翻开这个解释就能够了,这里不仅能够自定义我们所须要的下载器中间件,还能够禁用 DOWNLOADER_MIDDLEWARES_BASE 中定义的下载器中间件。

每一个下载器中间件都是一个Python类,该类定义了以下定义的一个或多个要领。

中心要领共有 4 个,以下:

  • process_request(request, spider)
  • process_response(request, response, spider)
  • process_exception(request, exception, spider)
  • from_crawler(cls, crawler)

而我们最少只须要完成个中的一个要领就能够定义一个下载器中间件。

process_request(request, spider)

参数:

  • request(Request对象)–正在处置惩罚的要求
  • spider(Spider对象)–此要求所针对的蜘蛛

关于经由过程下载中间件的每一个要求,都邑挪用此要领。

process_request() 应当是:return None,返回一个 Response 对象,返回一个Request 对象或激发 IgnoreRequest 非常。

假如返回 None ,则 Scrapy 将继承处置惩罚此要求,实行一切其他中间件,直到最终将恰当的下载程序处置惩罚程序称为实行的要求(并下载了其响应)。

假如它返回一个 Response 对象, Scrapy 不会打搅挪用任何其他 process_request() 或 process_exception() 要领,或响应的下载功用; 它将返回该响应。 process_response() 总是在每一个响应上挪用已装置中间件的要领。

假如返回一个 Request 对象, Scrapy 将住手挪用 process_request 要领并从新设计返回的要求。一旦实行了新返回的要求,就会在下载的响应上挪用恰当的中间件链。

假如激发 IgnoreRequest 非常,则一切的下载器中间件的要领 process_exception() 会顺次实行,假如没有一个要领处置惩罚该非常,那末 Request 的 errback() 要领就会回调,假如该非常还没处置惩罚,那末就会疏忽。

process_response(request, response, spider)

参数:

  • request (是一个 Request 对象)–提议响应的要求
  • response (response 对象)–正在处置惩罚的响应
  • spider (spider 对象)–此响应预期用于的蜘蛛

process_response() 应当:返回响应对象,返回要求对象或激发 IgnoreRequest 非常。

假如它返回一个 Response (它能够是雷同的给定响应,也能够是全新的响应),那末该响应将继承运用链中下一个中间件的 process_response() 举行处置惩罚。

假如它返回一个 Request 对象,则中间件链将停息,并将返回的要求从新安排为未来下载。 这与从 process_request() 返回要求的行动雷同。

假如激发 IgnoreRequest 非常,则挪用要求的 errback 函数(Request.errback)。 假如没有代码处置惩罚激发的非常,则将其疏忽而且不纪录(与其他非常差别)。

process_exception(request, exception, spider)

参数:

  • request (是一个Request对象)–生成非常的要求
  • exception (Exception对象)–激发的非常
  • spider (spider对象)–此要求所针对的蜘蛛

当下载处置惩罚程序或 process_request() (从下载程序中间件中)激发非常(包含 IgnoreRequest 非常)时, Scrapy 会挪用 process_exception() 。

process_exception() 应当返回:无,响应对象或要求对象。

假如返回 None ,则 Scrapy 将继承处置惩罚此非常,实行已装置中间件的任何其他 process_exception() 要领,直到没有中间件为止,而且默许非常处置惩罚入手下手。

假如返回 Response 对象,则会启动已装置中间件的 process_response() 要领链,而且 Scrapy 不会省心挪用中间件的任何其他 process_exception() 要领。

假如它返回一个 Request 对象,则将返回的要求从新安排为未来下载。 这将住手实行中间件的 process_exception() 要领,就像返回响应一样。

from_crawler(cls, crawler)

参数:

  • crawler(搜寻器对象)–运用此中间件的搜寻器

假如存在,则挪用该类要领以从 Crawler 建立中间件实例。 它必需返回中间件的新实例。 搜寻器对象供应对一切 Scrapy 中心组件(如设置和信号)的接见; 它是中间件接见它们并将其功用连接到 Scrapy 中的一种体式格局。

示例

起首,我们照样在前面的 Scrapy 的项目上新建一个 Spider ,详细代码以下:

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

class HttpbinSpider(scrapy.Spider):
    name = 'httpbin'
    allowed_domains = ['httpbin.org']
    start_urls = ['https://httpbin.org/get']

    def parse(self, response):
        self.logger.debug(response.text)

运用以下敕令运转一下:

scrapy crawl httpbin

效果部份截取以下:

{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,br",
    "Accept-Language": "en",
    "Host": "httpbin.org",
    "User-Agent": "Scrapy/1.8.0 ( https://scrapy.org)"
  },
  "origin": "183.195.68.215, 183.195.68.215",
  "url": "https://httpbin.org/get"
}

能够看到,这里的 UA 头是 Scrapy/1.8.0 ( https://scrapy.org) ,这个实际上是由 Scrapy 内置的 UserAgentMiddleware 设置的。

这里我们经由过程修正一下 UA 头,固然修正 UA 头能够经由过程 settings 中的 USER_AGENT 举行设置,这里我们要演示下载器中间件嘛,所以就运用下载器中间件设置一下。

起首我们在 middlewares.py 中新增一个 UaDownLoaderMiddleware ,示例代码以下:

class UaDownLoaderMiddleware(object):
    
    def process_request(self, request, spider):

        request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'

新增完成后,还须要在配置文件 settings 中开启这个下载器中间件,找到 DOWNLOADER_MIDDLEWARES ,将解释去掉,修正为:

DOWNLOADER_MIDDLEWARES = {
   'first_scrapy.middlewares.UaDownLoaderMiddleware': 543,
}

到这里,我们的修正就完成了,能够从新运转这只爬虫:

scrapy crawl httpbin

效果部份截取以下:

{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip,deflate,br",
    "Accept-Language": "en",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
  },
  "origin": "183.195.68.215, 183.195.68.215",
  "url": "https://httpbin.org/get"
}

能够看到,这里响应的 UA 已变成了我们适才设置的 UA 头,证实我们的修正是胜利的。

本篇就先到这里了,愿望列位同砚能够本身着手试一下。

示例代码

本系列的一切代码小编都邑放在代码治理堆栈 Github 和 Gitee 上,轻易人人取用。

示例代码-Github

示例代码-Gitee

参考

https://docs.scrapy.org/en/latest/topics/settings.html#std:setting-DOWNLOADER_MIDDLEWARES_BASE

https://docs.scrapy.org/en/latest/topics/downloader-middleware.html


更多内容请关注十大外围足彩网站