python爬虫人门(10)Scrapy框架之Downloader Middlewares
设置下载中间件(Downloader Middlewares)
下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。
当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);
在下载器完成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 对象)
– 处理的requestspider (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所对应的requestresponse (Response 对象)
– 被处理的responsespider (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相关推荐
- python爬虫的基本原理以及scrapy框架的使用
正则表达式基础 正则表达式用于处理字符串,拥有自己独立的语法以及一个独立的处理引擎. 不同提供正则表达式的语言里正则表达式的语法都式一样. . 和 * + . 匹配任意一个字符 *匹配0或多次前面出现 ...
- [python爬虫之路day19:] scrapy框架初入门day1——爬取百思不得姐段子
好久没学习爬虫了,今天再来记录一篇我的初入门scrapy. 首先scrapy是针对大型数据的爬取,简单便捷,但是需要操作多个文件以下介绍: 写一个爬虫,需要做很多的事情.比如: 发送网络请求, 数据解 ...
- 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息
使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...
- Python爬虫进阶三之Scrapy框架安装配置
初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...
- Python 爬虫进阶三之 Scrapy 框架安装配置
初级的爬虫我们利用 urllib 和 urllib2 库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架 Scrapy,这安装过程也是煞费苦心哪,在此整理如下. 官网 官方安装文档 安装p ...
- Python爬虫实战之利用Scrapy框架爬取传智播客课程数据
1.文件结构: 2.lesson.py代码 import scrapy from ts.items import TsItem from scrapy.http import Requestclass ...
- 爬虫 第六讲 Scrapy框架
文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...
- Python可视化数据分析02、Scrapy框架-强化测试Scrapy-CSS
Python可视化数据分析02.Scrapy框架
- Python基础知识回顾及scrapy框架爬虫基础
1.函数 函数参数:必须 默认 关键 可变 函数种类:外部 内部 匿名 lambda 装饰函数:@语法糖 函数总是要返回的 ,若没有return,None总是被返回 2.面向对象: 对象:已存在, ...
最新文章
- css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏
- linux mysql 大页_Linux HugePages及MySQL 大页配置
- python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?
- 【转载】PHP面向对象(OOP)编程入门教程
- Python学习之函数返回多个值
- SpringBoot-@Configuration
- php mysql 正则_MySQL 正则表达式
- Per-FedAvg:联邦个性化元学习
- Java API 之 SPI机制
- FFmpeg安卓平台编译
- 杜教筛 以及积性函数的前世今生 --算法竞赛专题解析(4)
- 关于ubuntu开机菜单栏和任务栏不见了的有效解决方法
- 电容或电感的电压_如何通俗的理解电流,电压,电阻,电容和电感?
- 树莓派监测CPU温度
- oracle中锁机制,Oracle锁的基本机制
- c/c++游戏编程之Easyx图形库基础
- MySQL的自身防御机制_自我防御机制
- 【小程序】开发需要注意的地方(三)
- 求助:“[‘Pacch‘] not in index“(Kaggle泰坦尼克号模型)
- nvenc vs x264 对比(1)
热门文章
- 加速产业AI化!浪潮提出”元脑“生态计划,要用计算力+生态成就行业AI大脑...
- python中关于操作时间的方法(一):使用time模块
- 海思全力部署智能城市NB-IoT应用
- SpringMVC4 返回Json数据
- ubuntu无限卡在logo界面
- expect,spawn用法小结
- Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- Call指令和Ret指令讲解
- 互联网协议 — TCP — (面向面向连接的)三次握手、四次挥手
- NanoPi NEO Air使用六:使用摄像头