设置下载中间件(Downloader Middlewares)

下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。

  1. 当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);

  2. 在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)

要激活下载器中间件组件,将其加入到 DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。

DOWNLOADER_MIDDLEWARES = {'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

编写下载器中间件十分简单。每个中间件组件是一个定义了以下一个或多个方法的Python类:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

process_request(self, request, spider)

  • 当每个request通过下载中间件时,该方法被调用。

  • process_request() 必须返回以下其中之一:一个 None 、一个 Response 对象、一个 Request 对象或 raise IgnoreRequest:

    • 如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。

    • 如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。

    • 如果其返回 Request 对象,Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。

    • 如果其raise一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。

  • 参数:

    • request (Request 对象) – 处理的request
    • spider (Spider 对象) – 该request对应的spider

process_response(self, request, response, spider)

当下载器完成http请求,传递响应给引擎的时候调用

  • process_request() 必须返回以下其中之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。

    • 如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。

    • 如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。

    • 如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

  • 参数:

    • request (Request 对象) – response所对应的request
    • response (Response 对象) – 被处理的response
    • spider (Spider 对象) – response所对应的spider

实例

#!/usr/bin/env python
# -*- coding:utf-8 -*-import random
import base64from settings import USER_AGENTS
from settings import PROXIES# 随机的User-Agent
class RandomUserAgent(object):def process_request(self, request, spider):useragent = random.choice(USER_AGENTS)request.headers.setdefault("User-Agent", useragent)class RandomProxy(object):def process_request(self, request, spider):proxy = random.choice(PROXIES)if proxy['user_passwd'] is None:# 没有代理账户验证的代理使用方式request.meta['proxy'] = "http://" + proxy['ip_port']else:# 对账户密码进行base64编码转换base64_userpasswd = base64.b64encode(proxy['user_passwd'])# 对应到代理服务器的信令格式里request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswdrequest.meta['proxy'] = "http://" + proxy['ip_port']

为什么HTTP代理要使用base64编码:

HTTP代理的原理很简单,就是通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过,就这么简单,下面是具体的信令格式:

修改settings.py配置USER_AGENTS和PROXIES

添加USER_AGENTS:

 USER_AGENTS = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",]

添加代理IP设置PROXIES:

PROXIES = [{'ip_port': 'ip:port1', 'user_passwd': 'user1:pass1'},{'ip_port': 'ip2:port2', 'user_passwd': 'user2:pass2'},{'ip_port': 'ip3:port3', 'user_passwd': 'user3:pass3'},
]

除非特殊需要,禁用cookies,防止某些网站根据Cookie来封锁爬虫。

COOKIES_ENABLED = False

设置下载延迟

DOWNLOAD_DELAY = 3

最后添加自己写的下载中间件类

DOWNLOADER_MIDDLEWARES = {'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

BOT_NAME默认: 'scrapybot'当您使用 startproject 命令创建项目时其也被自动赋值。CONCURRENT_ITEMS默认: 100Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。CONCURRENT_REQUESTS
默认: 16Scrapy downloader 并发请求(concurrent requests)的最大值。DEFAULT_REQUEST_HEADERS
默认: 如下{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
Scrapy HTTP Request使用的默认header。DEPTH_LIMIT默认: 0爬取网站最大允许的深度(depth)值。如果为0,则没有限制。DOWNLOAD_DELAY
默认: 0下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:DOWNLOAD_DELAY = 0.25 # 250 ms of delay

默认情况下,Scrapy在两个请求间不等待一个固定的值, 而是使用0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY 的结果作为等待间隔。
DOWNLOAD_TIMEOUT默认: 180下载器超时时间(单位: 秒)。ITEM_PIPELINES
默认: {}保存项目中启用的pipeline及其顺序的字典。该字典默认为空,值(value)任意,不过值(value)习惯设置在0-1000范围内,值越小优先级越高。ITEM_PIPELINES = {
'mySpider.pipelines.SomethingPipeline': 300,
'mySpider.pipelines.ItcastJsonPipeline': 800,
}
LOG_ENABLED默认: True是否启用logging。LOG_ENCODING默认: 'utf-8'logging使用的编码。LOG_LEVEL默认: 'DEBUG'log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。USER_AGENT
默认: "Scrapy/VERSION (+http://scrapy.org)"爬取的默认User-Agent,除非被覆盖。PROXIES: 代理设置
示例:PROXIES = [{'ip_port': '111.11.228.75:80', 'password': ''},{'ip_port': '120.198.243.22:80', 'password': ''},{'ip_port': '111.8.60.9:8123', 'password': ''},{'ip_port': '101.71.27.120:80', 'password': ''},{'ip_port': '122.96.59.104:80', 'password': ''},{'ip_port': '122.224.249.122:8088', 'password':''},
]
COOKIES_ENABLED = False
禁用Cookies

所有settings介绍

python爬虫人门(10)Scrapy框架之Downloader Middlewares相关推荐

  1. python爬虫的基本原理以及scrapy框架的使用

    正则表达式基础 正则表达式用于处理字符串,拥有自己独立的语法以及一个独立的处理引擎. 不同提供正则表达式的语言里正则表达式的语法都式一样. . 和 * + . 匹配任意一个字符 *匹配0或多次前面出现 ...

  2. [python爬虫之路day19:] scrapy框架初入门day1——爬取百思不得姐段子

    好久没学习爬虫了,今天再来记录一篇我的初入门scrapy. 首先scrapy是针对大型数据的爬取,简单便捷,但是需要操作多个文件以下介绍: 写一个爬虫,需要做很多的事情.比如: 发送网络请求, 数据解 ...

  3. 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息

    使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...

  4. Python爬虫进阶三之Scrapy框架安装配置

    初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...

  5. Python 爬虫进阶三之 Scrapy 框架安装配置

    初级的爬虫我们利用 urllib 和 urllib2 库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架 Scrapy,这安装过程也是煞费苦心哪,在此整理如下. 官网 官方安装文档 安装p ...

  6. Python爬虫实战之利用Scrapy框架爬取传智播客课程数据

    1.文件结构: 2.lesson.py代码 import scrapy from ts.items import TsItem from scrapy.http import Requestclass ...

  7. 爬虫 第六讲 Scrapy框架

    文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...

  8. Python可视化数据分析02、Scrapy框架-强化测试Scrapy-CSS

    Python可视化数据分析02.Scrapy框架

  9. Python基础知识回顾及scrapy框架爬虫基础

    1.函数 函数参数:必须 默认 关键 可变 函数种类:外部 内部 匿名 lambda 装饰函数:@语法糖 函数总是要返回的 ,若没有return,None总是被返回   2.面向对象: 对象:已存在, ...

最新文章

  1. css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏
  2. linux mysql 大页_Linux HugePages及MySQL 大页配置
  3. python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?
  4. 【转载】PHP面向对象(OOP)编程入门教程
  5. Python学习之函数返回多个值
  6. SpringBoot-@Configuration
  7. php mysql 正则_MySQL 正则表达式
  8. Per-FedAvg:联邦个性化元学习
  9. Java API 之 SPI机制
  10. FFmpeg安卓平台编译
  11. 杜教筛 以及积性函数的前世今生 --算法竞赛专题解析(4)
  12. 关于ubuntu开机菜单栏和任务栏不见了的有效解决方法
  13. 电容或电感的电压_如何通俗的理解电流,电压,电阻,电容和电感?
  14. 树莓派监测CPU温度
  15. oracle中锁机制,Oracle锁的基本机制
  16. c/c++游戏编程之Easyx图形库基础
  17. MySQL的自身防御机制_自我防御机制
  18. 【小程序】开发需要注意的地方(三)
  19. 求助:“[‘Pacch‘] not in index“(Kaggle泰坦尼克号模型)
  20. nvenc vs x264 对比(1)

热门文章

  1. 加速产业AI化!浪潮提出”元脑“生态计划,要用计算力+生态成就行业AI大脑...
  2. python中关于操作时间的方法(一):使用time模块
  3. 海思全力部署智能城市NB-IoT应用
  4. SpringMVC4 返回Json数据
  5. ubuntu无限卡在logo界面
  6. expect,spawn用法小结
  7. Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
  8. Call指令和Ret指令讲解
  9. 互联网协议 — TCP — (面向面向连接的)三次握手、四次挥手
  10. NanoPi NEO Air使用六:使用摄像头